JavaWeb过滤器(Filter)

参考:https://blog.csdn.net/yuzhiqiang_1993/article/details/81288912

原理:

一般实现流程:

1、新建一个类,实现Filter接口
2、实现doFilter()方法,打印一句话,来证明能够进行拦截
3、在web.xml中进行配置(参照Servlet配置)
4、访问一个页面,看看能不能拦截

 

1、Filter实现类

import java.io.IOException;
 
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
public class UserFilter implements Filter {
 
    @Override
    public void destroy() {
        // TODO Auto-generated method stub
         
    }
     
    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
    }
 
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        // 获取session对象,判断是否登录
        HttpServletRequest req=(HttpServletRequest)request;
        HttpServletResponse res=(HttpServletResponse)response;
        HttpSession session = req.getSession();
        if(session.getAttribute("user")==null){
            // 非法访问,没有登录,跳转到登录页面
            session.setAttribute("error","非法访问");
            // 保存客户想要去的地址, 登录成功后则直接跳转,而不是到首页
            // 获取请求的地址, 包括工程名,但是不包括参数
            System.out.println(req.getRequestURI());
            // 获取请求的参数
            System.out.println("参数:" + req.getQueryString());
            // 获取当前项目的绝对路径,方法已过时,不推荐使用 推荐使用  request.getServletContext().getRealPath("")
            System.out.println(req.getRealPath(""));
            // 获取请求的地址, 但是不包括工程名和参数
            System.out.println(req.getServletPath());
            // 此方法需要在servlet 3.0的版本上使用, 开发的环境需要J2EE6 运行需要Tomcate7.0
            //System.out.println("request.getServletContext().getRealPath:" +request.getServletContext().getRealPath(""));
            String goURL=req.getServletPath();
            if(req.getQueryString()!=null){
                goURL += "?" + req.getQueryString();
            }
            System.out.println(goURL);
            session.setAttribute("goURL", goURL);
            res.sendRedirect(req.getContextPath() + "/login.jsp");
            System.out.println(req.getContextPath());
        }else{
            // 如果有下一个过滤器则跳转到下一个过滤器否则目标页面
            chain.doFilter(request, response);
        }
    }
}
session.setAttribute("error","非法访问")可以用对象取代,如:
request.getSession().setAttribute("humanSession", human对象);

2、web.xml配置

<filter>
    <filter-name>userFilter</filter-name>
    <filter-class>
        cn.***.UserFilter
    </filter-class>
  </filter>
  <filter-mapping>
    <filter-name>userFilter</filter-name>
    <url-pattern>/user/*</url-pattern><br>    <dispatcher>REQUEST</dispatcher> <!-- 没有配置dispatcher就是默认request方式的 --> 
      <dispatcher>FORWARD</dispatcher> 
      <dispatcher>ERROR</dispatcher> 
      <dispatcher>INCLUDE</dispatcher>
  </filter-mapping>

 

posted @ 2019-08-06 15:23  zhaoyanhao  阅读(469)  评论(0编辑  收藏  举报