前言
一般的javaWeb项目中我们肯定会使用过滤器来实现对一些请求的过滤,通过过滤来实现对一些请求参数的设置和校验,比如我们比较熟悉的CharacterEncodingFilter就是一个字符编码的过滤器,小编今天就filter实现拦截登录的过程做一个简单的演示。
预期效果
一般当我们访问某个页面时,如果没有登录,则需要跳转到登录页面,登陆后在跳转到主页面。
实现代码
主要通过实现Servlet的Filter接口即可,主要代码如下,其中为了防止静态资源、登录页面、登录请求被过滤拦截,可将对应的请求排除掉(具体见代码标红部分)
1 package com.yongcheng.liuyang.filter; 2 3 import java.io.IOException; 4 import java.util.ArrayList; 5 import java.util.Arrays; 6 import java.util.List; 7 8 import javax.servlet.Filter; 9 import javax.servlet.FilterChain; 10 import javax.servlet.FilterConfig; 11 import javax.servlet.ServletException; 12 import javax.servlet.ServletRequest; 13 import javax.servlet.ServletResponse; 14 import javax.servlet.http.HttpServletRequest; 15 import javax.servlet.http.HttpServletResponse; 16 import javax.servlet.http.HttpSession; 17 18 import org.springframework.util.StringUtils; 19 20 /** 21 * 用户登录过滤器 22 * 23 * 24 * 25 * @author Administrator 26 * 27 */ 28 public class UserLoginFilter implements Filter 29 { 30 31 private static List<String> urls = Arrays.asList(new String[]{"js/","images/","jsp/","/doLogin","/login"}); 32 33 @Override 34 public void destroy() 35 { 36 37 } 38 39 @Override 40 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, 41 FilterChain chain) 42 throws IOException, ServletException 43 { 44 HttpServletRequest req = (HttpServletRequest)servletRequest; 45 HttpServletResponse rep = (HttpServletResponse)servletResponse; 46 HttpSession session = req.getSession(); 47 48 //获取当前请求的uri 49 String uri = req.getRequestURI(); 50 51 if (isIegalUrl(uri)) 52 { 53 chain.doFilter(servletRequest, servletResponse); 54 } 55 else 56 { 57 //如果当前session中存储了用户信息则直接访问,否则跳转到登录页面 58 if (StringUtils.isEmpty(session.getAttribute("user"))) 59 { 60 rep.sendRedirect("login"); 61 } 62 else 63 { 64 chain.doFilter(servletRequest, servletResponse); 65 } 66 } 67 68 } 69 70 71 @Override 72 public void init(FilterConfig arg0) throws ServletException 73 { 74 75 } 76 77 78 private boolean isIegalUrl(String uri) 79 { 80 for (String string : urls) { 81 //如果当前请求包括这些静态资源文件,则不处理, 82 if (uri.indexOf(string) > -1) 83 { 84 return true; 85 } 86 } 87 88 return false; 89 } 90 91 }
上面提到的对静态资源不过滤,当然springmvc中也要设置静态资源的请求不经过DispatcherServlet,此时就需要在spring-mvc.xml中进行设置,小编基本使用默认的配置,如下代码中的<mvc:default-servlet-handler />
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:mvc="http://www.springframework.org/schema/mvc" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans-4.3.xsd 8 http://www.springframework.org/schema/context 9 http://www.springframework.org/schema/context/spring-context-4.3.xsd 10 http://www.springframework.org/schema/mvc 11 http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd "> 12 13 <context:component-scan base-package="com.yongcheng.liuyang.controller"> 14 </context:component-scan> 15 <context:component-scan base-package="com.yongcheng.liuyang.listener" /> 16 17 <!-- spring MVC不处理静态资源 --> 18 <mvc:default-servlet-handler /> 19 <!-- 支持MVC的注解驱动 --> 20 <mvc:annotation-driven /> 21 22 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" 23 id="internalResourceViewResolver" > 24 <!-- 自动添加到路径中的前缀 --> 25 <property name="prefix" value="/jsp/" /> 26 <!-- 自动添加到路径中的后缀 --> 27 <property name="suffix" value=".jsp" /> 28 </bean> 29 61 </beans>
好了,以上就是springmvc中简答的filter使用!如有任何疑问,欢迎留言交流!!