首页 > 其他 > 详细

关于用session实现的过滤器(filter)失效问题

时间:2021-05-28 17:00:51      阅读:25      评论:0      收藏:0      [点我收藏+]

动机

在写一个Java考试管理系统项目的时候,通过写一个filter来防止用户恶意登录

public class OneFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpSession session = null;
        String uri = req.getRequestURI();
        //允许login页面通过过滤器
        if(uri.indexOf("login")!=-1){
            filterChain.doFilter(servletRequest,servletResponse);
            return;
        }
        //判断session是否存在
        session = req.getSession(false);
        if(session!=null){
            filterChain.doFilter(servletRequest,servletResponse);
            return;
        }
        req.getRequestDispatcher("/login_error.html").forward(servletRequest,servletResponse);
    }

原理就是通过检测session的有无来判断用户的合法性,在login页面是没有为用户创建session的,只有成功登录过后,才会为用户创建一个session,这样才能访问服务器其他页面。


然而在实际的测试过程中,无论用户有没有登录,都可以直接访问到其他的页面,过滤器失效了。

思路

filter在session的获取中,我用的是
session = req.getSession(false);
也就是说如果没有session,只会返回null而不会重新创建一个新的。所以说明已经存在了一个session被获取了。
于是我通过断点设置,发现运行到这一步时确实获得了一个session对象。


在初始的登录页面中,按f12查询

Cookie: JSESSIONID=719A434F43E33292188515186D47A372; Webstorm-3e8201=b6432217-7a68-4580-861b-9f3156ff5c90; _ga=GA1.1.1976587345.1609340809

这里发现在进入login.jsp界面时就已经有一个jsessionid,也就是session已经被创建了。

解决

查询资料才得知,登录jsp页面时,如果没有session,jsp会自动创建一个。
因为jsp中指令session默认配置为true,

<%@ page session="true"%>,所以解决这个问题很简单,只需要在jsp页面中加上<%@ page session="false"%>即可。


现在再次登录login.jsp

Cookie: Webstorm-3e8201=b6432217-7a68-4580-861b-9f3156ff5c90; _ga=GA1.1.1976587345.1609340809

一切正常,没有多余的session出现。

拓展

在服务器调用中,http服务器将jsp文件编辑成servlet接口实现类文件.java

所以通过查询jsp生成的java文件,就可以查看到jsp在运行时做了什么。

try {
      response.setContentType("text/html;charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;
}

果然,在编辑后的java文件中,出现了

session = pageContext.getSession();语句,session被创建。


编辑后的.java文件和.class文件一般存放在
C:\Users\[用户名]\.IntelliJIdea版本号\system\tomcat\project\work\Catalina\localhost\项目名称\org\apache\jsp\

关于用session实现的过滤器(filter)失效问题

原文:https://www.cnblogs.com/ssr1377/p/14822575.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!