SpringMVC拦截器的实现单方登陆
过滤器跟拦截器的区别
①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
1.过滤器和拦截器触发时机不一样:
过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。
2.过滤器的触发时机是容器后,servlet之前,所以过滤器的doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
的入参是ServletRequest ,而不是httpservletrequest。因为过滤器是在httpservlet之前。
以下为代码.
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import com.mingniu.entity.Manager; import com.mingniu.util.Log4jUtil; import com.mingniu.util.MemoryData; public class SingleUserInterceptor implements HandlerInterceptor { @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { // TODO Auto-generated method stub } @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { // TODO Auto-generated method stub } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception { String url = request.getRequestURI(); Log4jUtil.Coupons.info("[SingleUserInterceptor] preHandle()URL:" + url); // 如果拦截到的是登录的页面的话放行 if (url.indexOf("logn") >= 0) { return true; } // 如果是其他请求地址,进行拦截 Manager user = (Manager) request.getSession().getAttribute("user"); if (user != null) { String sessionid = MemoryData.getSessionIDMap().get(user.getManager_account()); // 如果用户名存在放心(即登录放行) if (sessionid.equals(request.getSession().getId())) { return true; } else { // 如果请求的sessionID和此账号Map中存放的sessionID不一致,跳转到登陆页 // 判断如果是异步请求,设置响应头 sessionstatus为timeout,自动跳转,否则重定向 if (request.getHeader("x-requested-with") != null && request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) { response.setHeader("sessionstatus", "timeout"); return false; } else { String indexurl = request.getContextPath() + "/login.html"; response.sendRedirect(indexurl); return false; } } } // 如果session中没有admin,跳转到登陆页 request.getRequestDispatcher(request.getContextPath() + "/login.html").forward(request, response); return false; } }
SpringMVC配置文件
<!--配置拦截器, 多个拦截器,顺序执行 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**" /> <!-- 不进行拦截 --> <mvc:exclude-mapping path="/login.html" /> <mvc:exclude-mapping path="/css/**" /> <mvc:exclude-mapping path="/fonts/**" /> <mvc:exclude-mapping path="/images/**" /> <mvc:exclude-mapping path="/js/**" /> <mvc:exclude-mapping path="/lib/**" /> <bean class="com.mingniu.system.listen.SingleUserInterceptor" /> </mvc:interceptor> </mvc:interceptors>
登陆后添加判断
if (loginCode == 1) { // 将登录的用户存入Session中 HttpSession session = request.getSession(); session.setAttribute("user", acount); Log4jUtil.Coupons.info("[UserController] login()存入Session的对象:" + acount); // 在sessionIDMap中存放此用户sessionID String sessionID = session.getId(); String manager_account = acount.getManager_account(); Log4jUtil.Coupons.info("[UserController] login()获取到的sessionID:" + sessionID + ",账号:" + manager_account); // 判断是否存在该账号信息 Map<String, String> sessionIDMap = MemoryData.getSessionIDMap(); Log4jUtil.Coupons.info("[UserController] login()sessionIDMap:" + sessionIDMap); if (!sessionIDMap.containsKey(manager_account)) { // 不存在,首次登陆,放入Map sessionIDMap.put(manager_account, sessionID); } else if (sessionIDMap.containsKey(manager_account) && !sessionID.equals(sessionIDMap.get(manager_account))) { sessionIDMap.remove(manager_account); sessionIDMap.put(manager_account, sessionID); } }
文章地址:https://www.mojxtang.club/index.php/2018/11/21/springmvc拦截器的实现单方登陆/