本文共 2998 字,大约阅读时间需要 9 分钟。
实现过滤器的步骤:
1、创建普通的java类 2、实现javax.servlet.Filter接口,并实现对应的方法 3、设置web.xml的配置文件Filter01 com.shsxt.filter.Filter01 Filter01 /s01 Servlet01
chain.doFilter(request,response); //放行资源
注:在放行资源之前处理request请求,响应会在放行之后执行
过滤器链:
如果有多个过滤器,拦截顺序为web.xml中的配置顺序,谁先配置谁先执行。 放行时,如果有下一个过滤器,会自动放行到下一个过滤器,如果没有则放行到指定资源。处理前台传递中文数据给后台,出现乱码问题。
Tomcat8及以上版本 Tomcat7及以下版本 * * POST请求 乱码 乱码 * request.setCharacterEncoding("UTF-8"); request.setCharacterEncoding("UTF-8"); * new String(request.getParameter(name).getBytes("ISO-8859-1"),"UTF-8"); * GET请求 不乱码,不处理 乱码 * new String(request.getParameter(name).getBytes("ISO-8859-1"),"UTF-8");
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain) throws IOException, ServletException { // 基于Http HttpServletRequest request = (HttpServletRequest) arg0; HttpServletResponse response = (HttpServletResponse) arg1; // 处理POST请求 request.setCharacterEncoding("UTF-8"); // ========= GET请求 ======== // 得到请求类型 String method = request.getMethod(); // 判断是否是GET请求 if ("GET".equalsIgnoreCase(method)) { // 得到服务器的版本信息 String serverInfo = request.getServletContext().getServerInfo(); // Apache Tomcat/8.0.45 Apache Tomcat/7.0.79 // System.out.println(serverInfo); // 通过截取,得到具体的版本号 String versionStr = serverInfo.substring(serverInfo.indexOf("/")+1,serverInfo.indexOf(".")); // System.out.println(versionStr); // 判断服务器的版本是否是Tomcat7以下版本 if (versionStr != null && Integer.parseInt(versionStr) < 8) { // GET放行 放行的是做好乱码处理的request对象 HttpServletRequest myRequest = new MyWapper(request); chain.doFilter(myRequest, response); return; } } // POST请求放行 chain.doFilter(request, response); return; }
默认拦截所有资源
什么情况需要拦截:
用户访问一些需要登录成功之后才能访问的资源 什么时候才放行:1、指定页面,放行(无需登录即可访问的页面,比如登录页面、注册页面等)2、指定资源,放行(静态资源,放行;存放在statics目录下的资源放行)3、指定操作,放行(无需用户登录即可执行的操作,放行;比如登录操作、注册操作等)4、登录状态,放行(session作用域中是否存在指定对象)如果上述情况都不满足,则拦截跳转到登录页面
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain) throws IOException, ServletException { // 基于Http HttpServletRequest request = (HttpServletRequest) arg0; HttpServletResponse response = (HttpServletResponse) arg1; // 得到请求路径 String path = request.getRequestURI(); // 站点名+资源名 // 放行指定页面 (不需要用户登录即可访问页面 登录页面等) if (path.contains("/login.html")) { chain.doFilter(request, response); return; } // 放行静态资源 statics目录下的资源 (js、css、images等) if (path.contains("/statics")) { chain.doFilter(request, response); return; } // 放行操作放行 (不需要用户登录之后才能执行操作 登录操作、注册操作等) if (path.contains("/s01")) { chain.doFilter(request, response); return; } // 获取session对象,判断用户是否登录 String str = (String) request.getSession().getAttribute("user"); if (str != null) { chain.doFilter(request, response); return; } // 拦截跳转到登录页面 response.sendRedirect("login.html"); }
转载地址:http://efgpb.baihongyu.com/