springmvc--拦截器登录实现

spring mvc拦截器之拦截未登录


1.在web.xml中配置DispatcherServlet

配置好DispatcherServlet之后,DispatcherServlet会接受所有请求,包括静态资源的请求。

  1. <servlet>
  2. <servlet-name>spring</servlet-name>
  3. <servlet- class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  4. <load-on-startup>1</load-on-startup>
  5. </servlet>
  6. <servlet-mapping>
  7. <servlet-name>spring</servlet-name>
  8. <url-pattern>/</url-pattern>
  9. </servlet-mapping>


2.如何处理静态资源(目的:使拦截器不拦截静态资源)
(1)使用tomcat的defaultservlet来处理静态资源
  1. <servlet-mapping>
  2. <servlet-name> default</servlet-name>
  3. <url-pattern>/js /*</url-pattern>
  4. <url-pattern>*.css</url-pattern>
  5. <url-pattern>/images/*</url-pattern>
  6. </servlet-mapping>

(2)使用<mvc:default-servlet-handler />
 
  
配置它后会在Spring MVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,
它会像一个检查员,对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet
处理,如果不是静态资源的请求,才由DispatcherServlet继续处理。

一般Web应用服务器默认的Servlet名称是"default",因此DefaultServletHttpRequestHandler可以找到它。如果你所有的Web应用服

务器的默认Servlet名称不是"default",则需要通过default-servlet-name属性显示指定:

<mvc:default-servlet-handler default-servlet-name="所使用的Web服务器默认使用的Servlet名称" />

(3)采用<mvc:resources/>

 
  
  1. <mvc:resources mapping= "/images/**" location= "/images/"/>
  2. <mvc:resources mapping= "/js/**" location= "/js/" />
  3. <mvc:resources mapping= "/style/**" location= "/style/" />
  4. <mvc:resources mapping= "*.html" location= "/" />
注意:必须是webapp根目录下的路径
location:请求的资源地址。
mapping:映射后地址。
这里附上相关静态资源的博客http://www.cnblogs.com/fangqi/archive/2012/10/28/2743108.html
3.配置拦截器
注:在springmvc的配置文件中加入支持mvc的schema
  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:aop= "http://www.springframework.org/schema/aop"
  6. xmlns:mvc= "http://www.springframework.org/schema/mvc"
  7. xsi:schemaLocation= "http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
  8. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
  10. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
  11. default-lazy-init= "true">
  12. <mvc:interceptors>
  13. <!-- 登陆拦截器 -->
  14. <mvc:interceptor>
  15. <mvc:mapping path="/cart/**"/>
  16. <mvc:mapping path="/home/*"/>
  17. <mvc:mapping path="/settlement/*"/>
  18. <mvc:mapping path="/settlement"/>
  19. <bean class="com.tortuousroad.site.web.site.interceptor.LoginInterceptor"/>
  20. </mvc:interceptor>
  21. <mvc:interceptor>
  22. <mvc:mapping path="/**" />
  23. <bean class="com.tortuousroad.site.web.site.interceptor.UserInterceptor" />
  24. </mvc:interceptor>
  25. <mvc:interceptor>
  26. <mvc:mapping path="/**" />
  27. <bean class="com.tortuousroad.framework.web.interceptor.HelperInterceptor" />
  28. </mvc:interceptor>
  29. <mvc:interceptor>
  30. <mvc:mapping path="/**" />
  31. <bean class="com.tortuousroad.framework.web.interceptor.CtxInterceptor" />
  32. </mvc:interceptor>
  33. </mvc:interceptors>

4.定义实现HandlerInterceptor接口的实现类
这里只以登陆为例,(如访问购物车未登陆则转到登陆页面)
 
  
  1. package com.tortuousroad.site.web.site.interceptor;
  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpServletResponse;
  4. import com.tortuousroad.site.web.constants.WebConstants;
  5. import com.tortuousroad.site.web.utils.CookieUtil;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.web.servlet.HandlerInterceptor;
  8. import org.springframework.web.servlet.ModelAndView;
  9. import com.tortuousroad.site.web.base.objects.WebUser;
  10. import com.tortuousroad.user.entity.User;
  11. import com.tortuousroad.user.service.UserService;
  12. /**
  13. * 登陆拦截器
  14. */
  15. public class LoginInterceptor implements HandlerInterceptor {
  16. @Autowired
  17. private UserService userService;
  18. @Override
  19. public void afterCompletion(HttpServletRequest request,
  20. HttpServletResponse response, Object obj, Exception ex)
  21. throws Exception {
  22. }
  23. @Override
  24. public void postHandle(HttpServletRequest request,
  25. HttpServletResponse response, Object obj, ModelAndView modelAndView)
  26. throws Exception {
  27. }
  28. @Override
  29. public boolean preHandle(HttpServletRequest request,
  30. HttpServletResponse response, Object handler) throws Exception {
  31. WebUser webUser = CookieUtil.getLoginUser(request);
  32. if ( null == webUser) {
  33. String basePath = request.getScheme() + "//:" + request.getServerName() + ":" + request.getServerPort();
  34. response.sendRedirect(basePath + "/login");
  35. return false;
  36. }
  37. return true;
  38. }
  39. }
CookieUtil类
 
  
  1. package com.tortuousroad.site.web.utils;
  2. import com.tortuousroad.site.web.base.objects.WebUser;
  3. import com.tortuousroad.user.entity.User;
  4. import org.springframework.util.StringUtils;
  5. import javax.servlet.http.Cookie;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import java.io.UnsupportedEncodingException;
  9. import java.net.URLDecoder;
  10. import java.net.URLEncoder;
  11. import java.util.Objects;
  12. /**
  13. * Cookie工具类
  14. */
  15. public class CookieUtil {
  16. /**
  17. * 默认Cookie过期时间(单位:秒)
  18. */
  19. public static final int MAX_AGE = 60 * 30;
  20. /**
  21. * 用户登陆信息Cookie名字
  22. */
  23. public static final String USER_INFO = "ui";
  24. /**
  25. * 向Cookie中写入用户信息
  26. * @param response
  27. * @param user
  28. */
  29. public static void setLoginUser(HttpServletResponse response, WebUser user) {
  30. if ( null == response || null == user) {
  31. return;
  32. }
  33. long userId = user.getUserId();
  34. String username = user.getUsername();
  35. try {
  36. username = URLEncoder.encode(user.getUsername(), "UTF-8");
  37. } catch (UnsupportedEncodingException e) {
  38. e.printStackTrace();
  39. }
  40. StringBuilder cookieValue = new StringBuilder();
  41. //FIXME 用户ID此处写入是用于调试,上线需要去掉
  42. cookieValue.append(userId).append( "|").append(username).append( "|").append(user.getLoginStatus());
  43. addCookie(response, USER_INFO, cookieValue.toString());
  44. }
  45. /*将构造好的信息放入coolie中*/
  46. public static void addCookie(HttpServletResponse response, String name, String value) {
  47. Cookie cookie = new Cookie(name, value);
  48. cookie.setPath( "/");
  49. cookie.setMaxAge(MAX_AGE);
  50. response.addCookie(cookie);
  51. }
  52. /*从cookie取出用户登陆信息并且构造webuser对象返回*/
  53. public static WebUser getLoginUser(HttpServletRequest request) {
  54. if ( null == request) {
  55. return null;
  56. }
  57. //从cookie里取出用户信息(三个字段)
  58. String value = getCookieValue(USER_INFO, request);
  59. if (StringUtils.isEmpty(value)) {
  60. return null;
  61. }
  62. String[] array = value.split( "\\|");
  63. WebUser user = new WebUser();
  64. user.setUserId(Long.parseLong(array[ 0]));
  65. try {
  66. user.setUsername(URLDecoder.decode(array[ 1], "UTF-8"));
  67. } catch (UnsupportedEncodingException e) {
  68. user.setUsername(array[ 1]);
  69. }
  70. user.setLoginStatus(Integer.parseInt(array[ 2]));
  71. return user;
  72. }
  73. /*从cookie中取出用户的登陆信息*/
  74. public static String getCookieValue(String name, HttpServletRequest request) {
  75. if ( null == request || StringUtils.isEmpty(name)) {
  76. return null;
  77. }
  78. Cookie[] cookies = request.getCookies();
  79. if ( null == cookies || 0 == cookies.length) {
  80. return null;
  81. }
  82. for (Cookie cookie : cookies) {
  83. if (Objects.equals(cookie.getName(), name)) {
  84. return cookie.getValue();
  85. }
  86. }
  87. return null;
  88. }
  89. /**
  90. * 删除Cookie
  91. * @param response HttpServletResponse
  92. * @param name Cookie名
  93. * @param path Cookie Path
  94. */
  95. public static void removeCookie(HttpServletResponse response, String name, String path) {
  96. if ( null == response || StringUtils.isEmpty(name) || StringUtils.isEmpty(path)) {
  97. return;
  98. }
  99. Cookie cookie = new Cookie(name, "");
  100. cookie.setPath(path);
  101. cookie.setMaxAge( 0);
  102. response.addCookie(cookie);
  103. }
WebUser类
 
  
  1. package com.tortuousroad.site.web.base.objects;
  2. import java.io.Serializable;
  3. public class WebUser implements Serializable {
  4. private Long userId; // 用户ID
  5. private String username; // 用户名
  6. private int loginStatus; // 登陆状态
  7. public Long getUserId() {
  8. return userId;
  9. }
  10. public void setUserId(Long userId) {
  11. this.userId = userId;
  12. }
  13. public String getUsername() {
  14. return username;
  15. }
  16. public void setUsername(String username) {
  17. this.username = username;
  18. }
  19. public int getLoginStatus() {
  20. return loginStatus;
  21. }
  22. public void setLoginStatus(int loginStatus) {
  23. this.loginStatus = loginStatus;
  24. }

猜你喜欢

转载自blog.csdn.net/weixin_41722928/article/details/80846271