【Spring MVC】教程——使用攔截器實現權限控制

目錄(?)[+]

之前一直都在用mvc的攔截器權限控制,後來上網也研究了一些這方面的知識,下面就直接分享下我對mvc的攔截器的理解,通過項目來分析吧。。。

1、首先準備對應的架包


2、看看項目的架構


3、基本的web.xml文件

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  5.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  6.     <display-name>shiro</display-name>  
  7.   
  8.     <!-- 加載springmvc -->  
  9.     <servlet>  
  10.         <servlet-name>SpringMVC</servlet-name>  
  11.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  12.         <init-param>  
  13.             <param-name>contextConfigLocation</param-name>  
  14.             <param-value>classpath:mvc.xml</param-value>  
  15.         </init-param>  
  16.         <load-on-startup>1</load-on-startup>  
  17.     </servlet>  
  18.   
  19.     <!-- 以.htm結尾的都被mvc攔截 -->  
  20.     <servlet-mapping>  
  21.         <servlet-name>SpringMVC</servlet-name>  
  22.         <url-pattern>*.htm</url-pattern>  
  23.     </servlet-mapping>  
  24.       
  25.     <!-- 啓動spring 加載   需要加載其他的spring時 需啓動該監聽器  
  26.     <listener>  
  27.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  28.     </listener>  
  29.      -->  
  30. </web-app>  

3、配置classpath下的mvc.xml文件

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  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" xmlns:p="http://www.springframework.org/schema/p"  
  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-3.0.xsd  
  8.         http://www.springframework.org/schema/context  
  9.         http://www.springframework.org/schema/context/spring-context-3.0.xsd   
  10.         http://www.springframework.org/schema/mvc  
  11.         http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">  
  12.     <mvc:annotation-driven />  
  13.     <!-- 自動掃描包 -->  
  14.     <context:component-scan base-package="com.cat.spring.controller" />  
  15.   
  16.     <!--  配置mvc的攔截器 可以配置多個 -->  
  17.     <mvc:interceptors>  
  18.         <mvc:interceptor>  
  19.             <!--  需要被攔截的路徑 -->  
  20.             <mvc:mapping path="/member/**" />  
  21.             <!-- 攔截處理的interceptor -->  
  22.             <bean class="com.cat.interceptor.MemberInterceptor" />  
  23.         </mvc:interceptor>  
  24.     </mvc:interceptors>  
  25.   
  26.     <!-- mvc返回頁面的配置 -->  
  27.     <bean id="viewResolver"  
  28.         class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  29.         <!-- 模板路徑爲WEB-INF/pages/ -->  
  30.         <property name="prefix">  
  31.             <value>/WEB-INF/pages/</value>  
  32.         </property>  
  33.         <!-- 視圖模板後綴爲.JSP -->  
  34.         <property name="suffix">  
  35.             <value>.jsp</value>  
  36.         </property>  
  37.     </bean>  
  38.   
  39. </beans>  

4、接着就要配置攔截器了MemberInterceptor.java

[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. /** 
  2.  *  
  3.  */  
  4. package com.cat.interceptor;  
  5.   
  6. import java.net.URLEncoder;  
  7.   
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10. import javax.servlet.http.HttpSession;  
  11.   
  12. import org.apache.commons.lang.StringUtils;  
  13. import org.springframework.web.servlet.HandlerInterceptor;  
  14. import org.springframework.web.servlet.ModelAndView;  
  15.   
  16. /** 
  17.  * @author chenlf 
  18.  *  
  19.  *         2014-3-25 
  20.  */  
  21. public class MemberInterceptor implements HandlerInterceptor {  
  22.   
  23.     public final static String SEESION_MEMBER = "seesion_member";  
  24.   
  25.     /* 
  26.      * (non-Javadoc) 
  27.      *  
  28.      * @see org.springframework.web.servlet.HandlerInterceptor#afterCompletion(javax.servlet.http.HttpServletRequest, 
  29.      * javax.servlet.http.HttpServletResponse, java.lang.Object, java.lang.Exception) 
  30.      */  
  31.     public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2,  
  32.             Exception arg3) throws Exception {  
  33.         // TODO Auto-generated method stub  
  34.   
  35.     }  
  36.   
  37.     /* 
  38.      * (non-Javadoc) 
  39.      *  
  40.      * @see org.springframework.web.servlet.HandlerInterceptor#postHandle(javax.servlet.http.HttpServletRequest, 
  41.      * javax.servlet.http.HttpServletResponse, java.lang.Object, org.springframework.web.servlet.ModelAndView) 
  42.      */  
  43.     public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2,  
  44.             ModelAndView arg3) throws Exception {  
  45.         // TODO Auto-generated method stub  
  46.   
  47.     }  
  48.   
  49.     /* 
  50.      * (non-Javadoc) 
  51.      * 攔截mvc.xml配置的/member/**路徑的請求 
  52.      * @see org.springframework.web.servlet.HandlerInterceptor#preHandle(javax.servlet.http.HttpServletRequest, 
  53.      * javax.servlet.http.HttpServletResponse, java.lang.Object) 
  54.      */  
  55.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response,  
  56.             Object handler) throws Exception {  
  57.         //請求的路徑  
  58.         String contextPath=request.getContextPath();  
  59.         String  url=request.getServletPath().toString();  
  60.         HttpSession session = request.getSession();  
  61.         String user = (String) session.getAttribute(SEESION_MEMBER);  
  62.         //這裏可以根據session的用戶來判斷角色的權限,根據權限來重定向不同的頁面,簡單起見,這裏只是做了一個重定向  
  63.         if (StringUtils.isEmpty(user)) {  
  64.             //被攔截,重定向到login界面  
  65.             response.sendRedirect(contextPath+"/login.htm?redirectURL="  
  66.                     + URLEncoder.encode(url));  
  67.             return false;  
  68.         }  
  69.         return true;  
  70.     }  
  71.   
  72. }  
這樣攔截器的核心就配置完了,接下來就是一些登陸的處理操作

5、LoginController.java文件

[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. /** 
  2.  *  
  3.  */  
  4. package com.cat.spring.controller;  
  5.   
  6. import java.net.URLDecoder;  
  7.   
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpSession;  
  10.   
  11. import org.apache.commons.lang.StringUtils;  
  12. import org.springframework.stereotype.Controller;  
  13. import org.springframework.web.bind.annotation.RequestMapping;  
  14. import org.springframework.web.bind.annotation.RequestMethod;  
  15. import org.springframework.web.servlet.ModelAndView;  
  16.   
  17. import com.cat.interceptor.MemberInterceptor;  
  18.   
  19. /** 
  20.  * @author chenlf 
  21.  *  
  22.  *         2014-3-24 
  23.  */  
  24. @Controller  
  25. public class LoginController {  
  26.   
  27.     @RequestMapping(value = "/login", method = RequestMethod.GET)  
  28.     public ModelAndView login(String redirectURL, HttpServletRequest request) {  
  29.         ModelAndView view = new ModelAndView();  
  30.         //把攔截前路徑存下來,以便登入成功可以直接請求到登錄前的頁面  
  31.         view.addObject("redirectURL", redirectURL);  
  32.         view.setViewName("/login");  
  33.         return view;  
  34.     }  
  35.   
  36.     @RequestMapping(value = "/submit", method = RequestMethod.POST)  
  37.     public String submit(String username, String password, String redirectURL,  
  38.             HttpServletRequest request) {  
  39.         //模擬登陸成功 用戶admin 密碼admin的用戶  
  40.         if (StringUtils.isNotBlank(username) && StringUtils.isNotBlank(password)  
  41.                 && username.equals("admin") && password.equals("admin")) {  
  42.             //當登陸成功是,將用戶信息存放到session中去  
  43.             HttpSession session = request.getSession();  
  44.             session.setAttribute(MemberInterceptor.SEESION_MEMBER, "admin");  
  45.             if (StringUtils.isNotBlank(redirectURL)) {  
  46.                 return "redirect:" + URLDecoder.decode(redirectURL);  
  47.             }  
  48.             return "redirect:/member/index.htm";  
  49.         } else {  
  50.             if (StringUtils.isNotBlank(redirectURL)) {  
  51.                 return "redirect:/login.htm?" + URLDecoder.decode(redirectURL);  
  52.             }  
  53.             return "redirect:/login.htm";  
  54.         }  
  55.     }  
  56. }  

6、下面就是login.jsp文件

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="utf-8"%>  
  3. <!DOCTYPE html>  
  4. <html>  
  5.     <head>  
  6.         <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
  7.         <title>mvc權限登陸login</title>  
  8.     </head>  
  9.     <body>  
  10.         <h3>  
  11.             mvc權限登陸login  
  12.         </h3>  
  13.         <form action="submit.htm" method="post">  
  14.             <!-- 記錄重定向的url -->  
  15.             <input type="hidden" name="redirectURL" value="${redirectURL}" />  
  16.             <table>  
  17.                 <tr>  
  18.                     <td>  
  19.                         賬號  
  20.                     </td>  
  21.                     <td>  
  22.                         <input type="text" name="username" />  
  23.                     </td>  
  24.                     <td>  
  25.                         密碼  
  26.                     </td>  
  27.                     <td>  
  28.                         <input type="password" name="password" />  
  29.                     </td>  
  30.                 </tr>  
  31.                 <tr>  
  32.                     <td colspan="2" align="center">  
  33.                         <input type="submit" value="提交" />  
  34.                     </td>  
  35.                 </tr>  
  36.             </table>  
  37.         </form>  
  38.     </body>  
  39. </html>  

7、剩下的就是一些正常的mvc請求處理的文件,這裏就不贅訴了

8、到這裏看看效果吧

a、當非登陸狀態的時候,請求localhost:8010/demo-mvc/member/list.htm時,被攔截攔截,重定向到login頁面,並攜帶了當前的這個路徑(/member/list.htm)作爲參數傳到頁面

b、輸入正確的用戶名admin 密碼admin後登陸,會跳轉到攔截前的頁面

c、當登陸完成後,輸入地址爲http://localhost:8010/demo-mvc/member/index.htm,session中記錄着當前用戶的信息,不需要重新登陸了

9、因爲篇幅問題,一些不重要的文件沒有一一貼出來,有需要的可以到http://download.csdn.net/detail/a124753561/7098925下載源代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章