zoukankan      html  css  js  c++  java
  • 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>

  • 相关阅读:
    Spring事务的那些坑,这里都给你总结好了!
    8 种方案解决重复提交问题!你选择哪一种呀?
    一张900w的数据表,16s执行的SQL优化到300ms?
    这 5 个开源的能挣钱的 SpringBoot 项目,真TMD香!
    邮箱mail 发送类 ASP.NET C#
    ValidationSugar表单验证框架-支持ASP.NET MVC ASP.NET WebFroM
    Jquery几个比较实用,但又让很多人忽略的几个函数
    ASP.NET MVC和WebForm 轻松实现前端和后端的双重验证 jquery.validate+ValidationSugar
    让 ASP.NET JS验证和服务端的 双验证 更简单
    ASP.NETC#通用扩展函数之TypeParse 类型转换方便多了
  • 原文地址:https://www.cnblogs.com/zhaoyanhaoBlog/p/11309194.html
Copyright © 2011-2022 走看看