Javaweb--Filter过滤器的基本使用-爱代码爱编程
Filter 什么是过滤器?
1、Filter过滤器是javaweb的三大组件之一。三大组件分别是,Servlet程序,Listener监听器,Filter过滤器
2、Filter过滤器它是Javaee的规范,也就是接口
3、Filter过滤器的作用是:拦截请求,过滤响应。一般拦截请求用的比较多
拦截请求常见的应用场景有:
1、权限检查
2、日记操作
3、事务管理
...等
一些页面需要登录后才能操作,比如购物车页面,订单页面等,这时候就需要过滤请求,不是所有的请求都响应。而是过滤之后,再响应
这里写一个例子
public class Filter_impl implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
//拦截请求
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest)servletRequest;
HttpSession session = request.getSession();//获取session
//判断用户是否登录
Object user = session.getAttribute("user");
if(user==null){
//请求转发到登录页面
request.getRequestDispatcher("/login.jsp").forward(request,servletResponse);
}
}
@Override
public void destroy() {
}
}
还需要到web.xml文件中配置
<filter>
<!-- 给Filter起一个别名-->
<filter-name>AdmitFilter</filter-name>
<!-- Filter的全类名-->
<filter-class>Filter_impl</filter-class>
</filter>
<filter-mapping>
<!-- <filter-name>表示当前的拦截路径给哪一个Filter使用 -->
<filter-name>AdmitFilter</filter-name>
<!-- <url-pattern>表示拦截路径 /映射到web目录下,*表示全部-->
<url-pattern>/admit/*</url-pattern>
</filter-mapping>
a.jsp文件在在admit目录下,login.jsp在web目录下
这时候的session对象是不存在客户的,所以返回值为null,因此直接请求转发到登录页面
这里有一个小问题,过滤器该不该使用请求转发呢?大概的原理是这样的
如果使用了请求转发,那么会先通过Filter过滤器才能访问到Servlet程序,这时候就有问题了,如果我这时候没有登录,我直接访问a.jsp文件,那么过滤器会直接让我访问login.jsp页面,但是这时候地址栏依然是admit目录下的,
这时候的请求会被拦截。所以应该使用重定向,login页面可以越过过滤器直接访问Servlet,写入信息之后再访问。
或者第二种方法,拦截指定的页面,不将该目录下的所有页面都拦截
发现了原因,是因为使用了相对路径的情况,如果表单提交是绝对路径就可以了。