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

tech2022-07-05  171

过滤器

我们发现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() { } }
最新回复(0)