Filter应该——访问限制

     在我们做实际项目当中,经常会对部分页面的访问进行控制。例如在一个交友系统中,假设有一个页面是listFriends.jsp,当然用户要访问这个页面就必需要行进行登陆,如果是一个匿名用户(没登陆的用户)访问,那么系统的开发者就应当考虑对这个页面需不需要做一个访问的控制,以限定访问用户的类型。一般来说对于这样的样面都是需要做访问控制。一来可以避免操作出错,二来可以防止信息的泄漏。

      对具体一个页面,做访问控制可以有两种方法实现。一种是通过session,另一种通过Filter。假设一个用户登陆之后,开发者在session当中存储一个变量id,也就用是用户编号,这个编号是唯一的,可以在这个会话被销毁之前都有效,那么访问控制的语句如下:

   if(session.getAttribute("id") ==null)

   {

              response.sendRedirect(path);//path是处理的页面的路径

    }

当用户访问这个页面时,就会执行上面的语句,如果用户没有登陆那么就会自动跳转预先设定的处理页面。

      上面的办法只能够实现对一个页面的访问控制,如果是需要对多个页面进行访问控制,那么上面的方法就不可取。我们可以通过Filter来实现。

      首先,创建一个类MyFilter,这个类必须实现Filter这个接口,而且覆盖Filter接口定义的三个方法,具体代码如下,假设代码index.jsp页面是要进行控制访问的页面,处理页面是index_1.jsp,读者可以自己创建这两个页面,另外可以在doFilter()方法里加上自己的控制条件语句。

import java.io.IOException;

import javax.servlet.*;

import javax.servlet.http.*;

public class PatManagerFilter implements Filter{

 public void destroy() {
  // TODO Auto-generated method stub
  
 }

 public void doFilter(ServletRequest arg0, ServletResponse arg1,
   FilterChain arg2) throws IOException, ServletException {
  HttpServletRequest req = (HttpServletRequest)arg0;
  HttpServletResponse res = (HttpServletResponse)arg1;
  String path = req.getServletPath();//获取访问路径
  for(int i = path.length() - 1; i >= 0; i --)//获取访问的页面
   if(path.charAt(i) != '/')
        page = path.charAt(i) + page;
  if("index.jsp".equals(page))//如果访问的是index.jsp页面,那么跳转到index_1.jsp
  {
       res.sendRedirect("index_1.jsp");
  }
  arg2.doFilter(req, res);//执行原路径
 }

 public void init(FilterConfig arg0) throws ServletException {
  System.out.println("Init Filter");
  
 }

}
  然后,在web.xml当中加上下面的代码:

<filter>

<filter-name>myFilter</filter-name>

<filter-class>MyFilter</filter-class><!--类所在的路径-->

</filter>

<filter-mapping>

<filter-name>myFilter
</filter-name>

<url-pattern>/*.jsp</url-patter>

</filter-mapping>

     到些所需要做的工作结束,读者可以自行补充其它代码,然后测试。

     通过在web.xml当中配置Filter,开发可以最大限度减少冗余代码,可以对多个页面进行访问控制。

### Filter 功能的实现与使用 #### 基本概念 `filter()` 函数是一种内置工具,用于筛选可迭代对象中的特定元素。其基本语法为 `filter(function, iterable)`,其中 `function` 是一个返回布尔值的函数,而 `iterable` 则是一个可迭代的对象,如列表、元组或字符串等[^1]。 以下是通过 Python 中的 `filter()` 函数进行数据筛选的一个简单例子: ```python numbers = [1, 2, 3, 4, 5, 6] # 定义一个判断奇数的函数 def is_odd(num): return num % 2 != 0 # 使用 filter 进行筛选 odd_numbers = list(filter(is_odd, numbers)) print(odd_numbers) # 输出: [1, 3, 5] ``` 上述代码展示了如何利用自定义函数 `is_odd` 来筛选出列表中的所有奇数。 --- #### Django 中的 `filter` 方法扩展 在 Django 的 ORM 查询中,虽然无法直接使用逻辑运算符 `or`,但可以通过 `Q` 对象来构建复杂的查询条件。例如,在处理多个 OR 关系时,可以采用以下方式[^2]: ```python from django.db.models import Q queryset = MyModel.objects.filter(Q(field_a=value_a) | Q(field_b=value_b)) ``` 此代码片段实现了基于字段 `field_a` 和 `field_b` 的复合查询条件,满足任意一项即可被纳入结果集。 --- #### Java Web 开发中的过滤器 (Filter) Java Servlet 提供了一种机制——过滤器 (`javax.servlet.Filter`),允许开发者对 HTTP 请求和响应执行预处理或后处理操作。这种技术常应用于身份验证、日志记录或其他跨请求的操作场景[^4]。 创建并注册一个简单的过滤器通常涉及以下几个方面: 1. **编写过滤器类** 需要继承 `javax.servlet.Filter` 接口,并重写三个核心方法:`init(FilterConfig config)`、`doFilter(ServletRequest request, ServletResponse response, FilterChain chain)` 和 `destroy()`。 下面展示了一个基础的身份认证过滤器示例: ```java import javax.servlet.*; import java.io.IOException; public class AuthenticationFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException {} @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { String user = ((HttpServletRequest) request).getSession().getAttribute("user").toString(); if ("admin".equals(user)) { // 简单模拟用户权限校验 chain.doFilter(request, response); // 继续后续流程 } else { HttpServletResponse httpResponse = (HttpServletResponse) response; httpResponse.sendRedirect("/login"); // 跳转至登录页 } } @Override public void destroy() {} } ``` 2. **配置过滤器映射** 可以通过 XML 文件或者注解的方式完成过滤器的绑定工作。如果选择后者,则需标注目标类上的 `@WebFilter` 注解指定适用路径。 --- #### AOP vs 过滤器/拦截器 尽管过滤器和拦截器具备一定的横切关注点管理能力,它们本质上仍属于框架层面的设计模式;相比之下,AOP(Aspect-Oriented Programming)则提供更为抽象的概念模型,支持更灵活地分离业务逻辑与其他通用需求[^3]。 | 特性 | AOP | 过滤器 | 拦截器 | |-----------------|------------------------------|----------------------------|--------------------------| | 应用范围 | 类级别 | 整体应用层 | 控制器层次 | | 编程范式 | 面向切面 | 基于接口 | 基于回调 | | 主要用途 | 日志记录、事务控制等 | 用户授权、资源访问限制 | 数据转换、性能监控 | 以上表格总结了三种技术手段的核心差异及其典型应用场景。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值