过滤器、使用过滤器完成session效验

本文深入探讨了在Tomcat服务器中使用过滤器的重要性,解释了如何通过过滤器在请求到达Servlet前进行安全校验和逻辑处理,避免代码冗余,确保只有合法请求才能访问Servlet,同时介绍了过滤器的配置方法和session校验的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

过滤器

我们发现TOMCAT服务器接收到浏览器发送的请求后,会根据请求调用对应的Servlet来处理请求,只要请求路径中的URI是正确的,就一定能访问到对应的Servlet,不安全。另一方面,逻辑有重复,造成代码的冗余。因此,我们使用了过滤器来在TOMCAT接收到请求至调用Servlet处理请求之间进行拦截校验。如果请求符合要求则继续执行Servlet,如果不符合则直接打回。
特点:
① 过滤器是由TOMCAT来进行调用的。Servlet出发之前调用
② 请求的资源URL地址不改变,TOMCAT自动调用过滤器拦截。
③ 过滤器可以自定义配置项目资源拦截范围,符合拦截要求TOMCAT自动调用
④ 过滤器由我们编写,放入TOMCAT中执行,但是必须实现指定的接口
使用:
① 创建实现了过滤器接口Filter 的java类

public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}
    /**
     * 注意:
     * 该方法的作用相当于Servlet的service方法,TOMCAT接收到请求后
     * 如果符合拦截要求,会自动的调用Filter中的doFilter方法完成拦截处理
     * @param servletRequest
     * @param servletResponse
     * @param filterChain
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //声明拦截逻辑
        System.out.println("我是过滤器,,,我拦截了请求");
        //放行
        filterChain.doFilter(servletRequest,servletResponse);
    }
    @Override
    public void destroy() {}
}

配置过滤器的拦截范围,使用web.xml配置或者注解
在这里插入图片描述
web.xml方式配置:

<!--配置过滤器-->
    <filter>
        <filter-name>myFilter</filter-name>
        <filter-class>com.bjsxt.filter.MyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>myFilter</filter-name>
        <url-pattern>/*</url-pattern><!--拦截范围,和Servlet中配置要求相同-->
    </filter-mapping>

完成session的检验:这里需要注意的是

① 拦截范围是/*,也就是所有
② 我们需要明确放行的资源
2硬性放行,用户的基础功能
2.1.1登录页面放行
2.1.2静态资源放行(js文件,css文件,图片资源)
2.1.3 验证码的请求需要放行
2.1.4 登录功能放行
2.1.5 主页面放行
2.1.6 主页面加载的页面资源放行
2.1 session效验成功放行
③ session是否失效的校验标准是,查看session是否还有缓存的用户登录成功的个人信息。
④ Session失效中同样也出现了两种情况:
1)非Ajax请求的session失效:
直接在过滤器中重定向到登录页面,重新登录即可
2)Ajax请求的session失效:
在后台处理后应该直接响应而不是重定向,直接响应js的资源跳转代码的字符串即可

代码示例

@WebFilter("/*")
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //获取请求的URI地址
        HttpServletRequest req=(HttpServletRequest)servletRequest;
        HttpServletResponse resp=(HttpServletResponse)servletResponse;
        String requestURI = req.getRequestURI();
        System.out.println(requestURI);
        //硬性放行
        if( requestURI.endsWith("login.jsp") ||
            requestURI.endsWith(".js")       ||
            requestURI.endsWith(".css")      ||
            requestURI.contains("images")    ||
            requestURI.endsWith("codeServlet") ||
            requestURI.endsWith("codeCheckServlet") ||
            requestURI.endsWith("userServlet")
        ){
            filterChain.doFilter(servletRequest,servletResponse);
        }else{
            //session校验
            HttpSession session = req.getSession();
            Object emp = session.getAttribute("emp");
            if(emp!=null){
                //放行
                filterChain.doFilter(servletRequest,servletResponse);
            }else{
                //判断请求是否为Ajax请求
                if(req.getHeader("x-requested-with") != null && req.getHeader("x-requested-with").equals("XMLHttpRequest") ){
                    resp.getWriter().write("sessionTimeOut");
                }else{
                    //重定向到登录页面
                    resp.sendRedirect(req.getContextPath()+"/login.jsp");
                }
            }
        }
    }
    @Override
    public void destroy() {

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值