在写一个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\
下
原文:https://www.cnblogs.com/ssr1377/p/14822575.html