欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring MVC 攔截器實(shí)現(xiàn)登錄

 更新時(shí)間:2017年07月04日 15:54:13   作者:錢(qián)春華  
這篇文章主要介紹了Spring MVC 攔截器實(shí)現(xiàn)登錄,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

上篇博文我在博客中講到如何使用spring MVC框架來(lái)實(shí)現(xiàn)文件的上傳和下載,今天小錢(qián)給大家再來(lái)分享和介紹Spring MVC框架中相當(dāng)重要的一塊功能——攔截器。

關(guān)于攔截器的概念我在這里就不多說(shuō)了,大家可以上網(wǎng)百度或者看別人寫(xiě)的具體博客,我今天要說(shuō)的是攔截器在實(shí)際開(kāi)發(fā)中它有什么作用,怎樣用Spring MVC攔截器來(lái)實(shí)現(xiàn)可拔插方式管理各種功能。Interceptor攔截器,它的主要作用就是攔截用戶的請(qǐng)求并進(jìn)行相應(yīng)的處理。什么意思呢?比如說(shuō):通過(guò)攔截器來(lái)進(jìn)行用戶的權(quán)限驗(yàn)證,或者是用來(lái)判斷用戶是否已經(jīng)登錄等。

Spring MVC攔截器是可拔插式的設(shè)計(jì)。如果需要某個(gè)攔截器,只需要在配置文件中應(yīng)用該攔截器即可,如果不需要使用攔截器,只需要在配置文件中取消其應(yīng)用攔截器。不管是否應(yīng)用某個(gè)攔截器,對(duì)Spring MVC框架不會(huì)有任何的影響。本文將介紹HandlerInterceptor接口和演示“Spring MVC攔截器實(shí)現(xiàn)用戶權(quán)限驗(yàn)證”項(xiàng)目案例來(lái)學(xué)習(xí)、掌握攔截器。

本項(xiàng)目源碼下載:Spring MVC攔截器實(shí)現(xiàn)用戶權(quán)限驗(yàn)證

HandlerInterceptor接口

Spring MVC中的Interceptor攔截器攔截的請(qǐng)求是通過(guò)實(shí)現(xiàn)HandlerInterceptor接口來(lái)完成的。在Spring MVC中定義一個(gè)Interceptor攔截器非常簡(jiǎn)單,通過(guò)在要定義的Interceptor攔截器類(lèi)中實(shí)現(xiàn)Spring的HandlerInterceptor接口,或是繼承抽象類(lèi)HandlerInterceptorAdapter。

HandlerInterceptor接口定義了三個(gè)方法,Spring MVC就是通過(guò)這三個(gè)方法來(lái)對(duì)用戶的請(qǐng)求進(jìn)行攔截處理的,下面對(duì)這三個(gè)方法進(jìn)行具體的詳解:

(1)boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handle)。顧名思義,這個(gè)方法將在請(qǐng)求處理之前被調(diào)用。Spring MVC中的Interceptor實(shí)行的是鏈?zhǔn)秸{(diào)用,即在一個(gè)應(yīng)用中或者說(shuō)在一個(gè)請(qǐng)求中可以同時(shí)存在多個(gè)Interceptor。每個(gè)Interceptor的調(diào)用會(huì)依據(jù)它的聲明順序依次執(zhí)行,而且最先執(zhí)行的是Interceptor中的preHandle方法,所以可以在這個(gè)方法中進(jìn)行一些前置的初始化操作或者是對(duì)當(dāng)前請(qǐng)求的一個(gè)預(yù)處理,也可以在這個(gè)方法中進(jìn)行一些判斷來(lái)決定請(qǐng)求是否要繼續(xù)進(jìn)行下去。該方法的返回值是boolean類(lèi)型的,當(dāng)返回值為FALSE時(shí),表示請(qǐng)求結(jié)束,后續(xù)的Interceptor和Controller都不會(huì)再執(zhí)行;當(dāng)返回值為T(mén)RUE時(shí)就會(huì)繼續(xù)調(diào)用下一個(gè)Interceptor的preHandle方法;如果已經(jīng)是最后一個(gè)Interceptor,就會(huì)調(diào)用當(dāng)前請(qǐng)求的Controller方法。

(2)void postHandle(HttpServletRequest request,HttpServletResponse response,Object handler,ModelAndView mv)。該方法和之后的afterCompletion方法都只能在當(dāng)前所屬的Interceptor的preHandle方法的返回值為T(mén)RUE時(shí)才能被調(diào)用。postHandle方法,顧名思義,就是在當(dāng)前請(qǐng)求被處理之后,也就是Controller方法被調(diào)用之后執(zhí)行,但是它會(huì)在DispatcherServlet進(jìn)行視圖返回渲染之前被調(diào)用,所以我們可以在這個(gè)方法中對(duì)Controller處理之后的ModelAndView對(duì)象進(jìn)行操作。postHandle方法被調(diào)用的方向跟preHandle是相反的,也就是說(shuō)先聲明的Interceptor的postHandle方法反而會(huì)后執(zhí)行,這和Struts2里面的Interceptor的執(zhí)行過(guò)程類(lèi)似。

(3)void afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handler,Exception exception)。 該方法也是在當(dāng)前所屬的Interceptor的preHandle方法的返回值為T(mén)RUE時(shí)才會(huì)執(zhí)行。顧名思義,該方法將在這個(gè)請(qǐng)求結(jié)束之后,也就是在DispatcherServlet渲染了對(duì)應(yīng)的視圖之后執(zhí)行。這個(gè)方法的主要作用就是進(jìn)行資源整理。

攔截器實(shí)現(xiàn)用戶權(quán)限驗(yàn)證

本文將通過(guò)Spring MVC攔截器完成一個(gè)用戶權(quán)限驗(yàn)證的功能。即用戶必須登錄之后才可以訪問(wèn)這個(gè)web網(wǎng)站的首頁(yè),如果沒(méi)有登錄就直接訪問(wèn)網(wǎng)站首頁(yè),則攔截器會(huì)攔截請(qǐng)求,并將請(qǐng)求重新轉(zhuǎn)發(fā)到登錄頁(yè)面,同時(shí)提示用戶“需要先登錄再訪問(wèn)網(wǎng)站”,由于是演示案例,所以成功登錄之后的網(wǎng)站頁(yè)面我們直接是拼的一個(gè)網(wǎng)頁(yè)顯示給用戶。本項(xiàng)目作為測(cè)試案例,我就不創(chuàng)建Maven項(xiàng)目了,直接創(chuàng)建的是一個(gè)Dynamic Web Project(動(dòng)態(tài)的web項(xiàng)目),項(xiàng)目名稱(chēng)為:Interceptor,本項(xiàng)目采用Tomcat 8作為web服務(wù)器,我們需要在項(xiàng)目中引入以下jar包,jar包我就截圖演示了,附件源碼中l(wèi)ib文件夾下會(huì)有,這里直接給一個(gè)項(xiàng)目的目錄結(jié)構(gòu),如下圖:

這里寫(xiě)圖片描述 

首先呢,我們要做一個(gè)網(wǎng)頁(yè),這個(gè)網(wǎng)頁(yè)就是用來(lái)提示用戶的登錄信息,提示輸入用戶名和密碼,在此我們?cè)陧?xiàng)目的WebContent/WEB-INF/content文件夾中創(chuàng)建一個(gè)loginForm.jsp,這是一個(gè)jsp文件,具體代碼如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登錄頁(yè)面</title>
</head>
<body>
<h2>用于演示攔截器登錄頁(yè)面</h2>
<form action="login" method="post">
  <!-- 提示信息 -->
  <font color="red">${requestScope.message }</font>
   <table>
     <tr>
      <td><label>登錄名: </label></td>
       <td><input type="text" id="loginname" name="loginname" ></td>
     </tr>
     <tr>
      <td><label>密碼: </label></td>
       <td><input type="password" id="password" name="password" ></td>
     </tr>
     <tr>
       <td><input type="submit" value="登錄"></td>
     </tr>
   </table>
</form>
</body>
</html>

這時(shí)我們需要進(jìn)行處理/login的請(qǐng)求,我們需要寫(xiě)請(qǐng)求的功能代碼,在src目錄下創(chuàng)建“cn.edu.jit.controller”包,在創(chuàng)建一個(gè)UserController類(lèi),用來(lái)處理用戶請(qǐng)求。具體代碼如下:

package cn.edu.jit.controller;

import javax.servlet.http.HttpSession;

import cn.edu.jit.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

/**
 * 處理用戶請(qǐng)求控制器
 */
@Controller
public class UserController {

  /**
   * 處理/login請(qǐng)求
   */
  @RequestMapping(value="/login")
   public ModelAndView login(String loginname,String password,ModelAndView mv,HttpSession session) {
    //模擬數(shù)據(jù)庫(kù)根據(jù)登錄名和密碼查找用戶,判斷用戶登錄
    if(loginname != null && loginname.equals("錢(qián)春華") 
               && password 
               != null 
               && password.equals("123456")) {
      //模擬創(chuàng)建用戶
      User user = new User();
      user.setLoginname(loginname);
      user.setPassword(password);
      user.setUsername("錢(qián)春華");
      //登錄成功,將user對(duì)象設(shè)置到HttpSession作用范圍域
      session.setAttribute("user", user);
      //轉(zhuǎn)發(fā)到main請(qǐng)求
      mv.setViewName("redirect:main");
    } else {
      //登錄失敗,設(shè)置失敗提示信息,并跳轉(zhuǎn)到登錄頁(yè)面
      mv.addObject("message", "登錄名或密碼錯(cuò)誤,請(qǐng)重新輸入!");
      mv.setViewName("loginForm");
    }
    return mv;
  }

}

UserControlle類(lèi)的login方法用來(lái)處理登錄的請(qǐng)求,本項(xiàng)目沒(méi)有使用數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù),只是簡(jiǎn)單的模擬了用戶的登錄,只要用戶輸入登錄名是“錢(qián)春華”,密碼是“123456”,則驗(yàn)證通過(guò),并創(chuàng)建一個(gè)User對(duì)象保存到HttpSession當(dāng)中,同時(shí)將請(qǐng)求使用客戶端跳轉(zhuǎn)到main請(qǐng)求:如果登錄失敗提示信息到ModelAndView對(duì)象,同時(shí)將請(qǐng)求使用客戶端跳轉(zhuǎn)到loginFrom請(qǐng)求,即登錄頁(yè)面。

同樣地,我們剛剛寫(xiě)了一個(gè)用戶的登錄請(qǐng)求,我們接下來(lái)要處理/main請(qǐng)求,用于實(shí)現(xiàn)登錄之后給用戶顯示書(shū)的詳細(xì)定價(jià)以及出版信息,我們還在“cn.edu.jit.controller”包中創(chuàng)建一個(gè)名為BookController類(lèi),用于處理圖書(shū)請(qǐng)求。具體代碼如下:

package cn.edu.jit.controller;

import java.util.ArrayList;
import java.util.List;

import cn.edu.jit.domain.Book;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * 處理圖書(shū)請(qǐng)求控制器
 * @author 錢(qián)春華
 */
@Controller
public class BookController {
  /**
   * 處理/main請(qǐng)求
   */
  @RequestMapping(value="/main")
   public String main(Model model) {
    //模擬數(shù)據(jù)庫(kù)獲得所有圖書(shū)集合
    List<Book> book_list = new ArrayList<Book>();
    book_list.add(new Book("java.jpg","JAVA核心技術(shù)1","周立新 編著",90.00));
    book_list.add(new Book("ee.jpg","Android第一行代碼","郭霖 編著",72.50));
    book_list.add(new Book("android.jpg","Spring+MyBatis企業(yè)應(yīng)用實(shí)戰(zhàn)","李剛 編著",58.00));
    book_list.add(new Book("ajax.jpg","SpringMVC實(shí)戰(zhàn)","Alex Bretet 編著",99.00));
    //將圖書(shū)集合添加到model當(dāng)中
    model.addAttribute("book_list", book_list);
    //跳轉(zhuǎn)到main頁(yè)面
    return "main";
  }

}

BookController類(lèi)中的main方法用來(lái)處理網(wǎng)站首頁(yè)的請(qǐng)求,該方法獲得所有圖書(shū)的信息,并將它們?cè)O(shè)置到Model當(dāng)中,然后傳遞到main頁(yè)面。由于本案例沒(méi)有使用數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù),只是簡(jiǎn)單的創(chuàng)建了一個(gè)集合模擬從數(shù)據(jù)庫(kù)獲取圖書(shū)信息。

下面是登錄成功后訪問(wèn)網(wǎng)頁(yè)的main.jsp代碼,該jsp代碼位于WebContent/WEB-INF/content文件夾中。如下具體代碼所示:

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>首頁(yè)</title>
<style type="text/css">
  table{border-collapse:collapse;border-spacing:0;border-left:1px solid #888;border-top:1px solid #888;background:#efefef;}
  th,td{border-right:1px solid #888;border-bottom:1px solid #888;padding:5px 15px;}
  th{font-weight:bold;background:#ccc;}
</style>
</head>
<body>
<h2 align="center">歡迎[${sessionScope.user.username }]訪問(wèn)</h2>
<br>
<table border="1" align="center">
  <tr>
    <th>封面</th><th>圖書(shū)名稱(chēng)</th><th>作者</th><th>出版價(jià)格</th>
  </tr>
  <c:forEach items="${requestScope.book_list }" var="book">
    <tr>
      <td><img src="images/${book.image }" height="60"></td>
      <td>${book.name }</td>
      <td>${book.author }</td>
      <td>${book.price }</td>
    </tr>
  </c:forEach>
</table>
</body>
</html>

接下來(lái),我將設(shè)計(jì)攔截器驗(yàn)證用戶是否登錄,如果用戶沒(méi)有登錄,不可以訪問(wèn)除登錄頁(yè)面和登錄請(qǐng)求的所有Controller。我們?cè)趕rc文件下創(chuàng)建名為“cn.edu.jit.interceptor”這個(gè)包,在這個(gè)包下創(chuàng)建“AuthorizationInterceptor”類(lèi),用于演示攔截器驗(yàn)證用戶是否登錄。具體代碼如下:

package cn.edu.jit.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.edu.jit.domain.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/** 
 * 攔截器必須實(shí)現(xiàn)HandlerInterceptor接口
 */
public class AuthorizationInterceptor implements HandlerInterceptor {

  //不攔截"/loginForm"和"/login"請(qǐng)求
  private static final String[] IGNORE_URI = {"/loginForm", "/login"};

  /**
   * 該方法將在整個(gè)請(qǐng)求完成之后執(zhí)行, 主要作用是用于清理資源的,
   * 該方法也只能在當(dāng)前Interceptor的preHandle方法的返回值為true時(shí)才會(huì)執(zhí)行。 
   */
  @Override
  public void afterCompletion(HttpServletRequest request,
      HttpServletResponse response, Object handler, Exception exception)
      throws Exception {
    System.out.println("AuthorizationInterceptor afterCompletion --> ");

  }
  /** 
   * 該方法將在Controller的方法調(diào)用之后執(zhí)行, 方法中可以對(duì)ModelAndView進(jìn)行操作 ,
   * 該方法也只能在當(dāng)前Interceptor的preHandle方法的返回值為true時(shí)才會(huì)執(zhí)行。 
   */
  @Override
  public void postHandle(HttpServletRequest request, HttpServletResponse response,
      Object handler, ModelAndView mv) throws Exception {
    System.out.println("AuthorizationInterceptor postHandle --> ");

  }

  /** 
   * preHandle方法是進(jìn)行處理器攔截用的,該方法將在Controller處理之前進(jìn)行調(diào)用,
   * 該方法的返回值為true攔截器才會(huì)繼續(xù)往下執(zhí)行,該方法的返回值為false的時(shí)候整個(gè)請(qǐng)求就結(jié)束了。 
   */ 
  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
      Object handler) throws Exception {
    System.out.println("AuthorizationInterceptor preHandle --> ");
    //flag變量用于判斷用戶是否登錄,默認(rèn)為false 
    boolean flag = false; 
    //獲取請(qǐng)求的路徑進(jìn)行判斷
    String servletPath = request.getServletPath();
    //判斷請(qǐng)求是否需要攔截
    for (String s : IGNORE_URI) {
      if (servletPath.contains(s)) {
        flag = true;
        break;
      }
    }
    //攔截請(qǐng)求
    if (!flag) {
      //1.獲取session中的用戶 
      User user = (User) request.getSession().getAttribute("user");
      //2.判斷用戶是否已經(jīng)登錄 
      if(user == null) {
        //如果用戶沒(méi)有登錄,則設(shè)置提示信息,跳轉(zhuǎn)到登錄頁(yè)面
         System.out.println("AuthorizationInterceptor攔截請(qǐng)求:");
         request.setAttribute("message", "請(qǐng)先登錄再訪問(wèn)網(wǎng)站");
         request.getRequestDispatcher("loginForm").forward(request, response);
      } else {
        //如果用戶已經(jīng)登錄,則驗(yàn)證通過(guò),放行
         System.out.println("AuthorizationInterceptor放行請(qǐng)求:");
         flag = true;
      }
    }
    return flag;    
  }

}

我們需要在springmvc-config.xml文件中配置攔截器,配置代碼具體如下:

<mvc:interceptors>
  <mvc:interceptor>
    <mvc:mapping path="/*"/>
    <!-- 使用bean定義一個(gè)Interceptor,直接定義在mvc:interceptors根下面的Interceptor將攔截所有的請(qǐng)求 --> 
    <bean class="cn.edu.jit.interceptor.AuthorizationInterceptor"/>
  </mvc:interceptor>
</mvc:interceptors>

我們?cè)趙eb.xml中配置代碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
 <display-name>MultipartFileTest</display-name>

 <!-- 定義Spring MVC的前端控制器 -->
 <servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>
    org.springframework.web.servlet.DispatcherServlet
  </servlet-class>
  <init-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>/WEB-INF/springmvc-config.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
 </servlet>

 <!-- 讓Spring MVC的前端控制器攔截所有請(qǐng)求 -->
 <servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <url-pattern>/</url-pattern>
 </servlet-mapping>

 <!-- 編碼過(guò)濾器 -->
 <filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
 </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

</web-app>

我們來(lái)部署Interceptor這個(gè)Web應(yīng)用,在瀏覽器中輸入如下URL來(lái)測(cè)試應(yīng)用:

http://localhost:8088/Interceptor

按Enter(回車(chē)),出現(xiàn)以下頁(yè)面,如果沒(méi)有登錄,直接訪問(wèn)main請(qǐng)求,攔截器會(huì)攔截請(qǐng)求,驗(yàn)證用戶是否登錄,此時(shí)用戶若沒(méi)有登錄,則跳轉(zhuǎn)到登錄頁(yè)面。如下圖:

這里寫(xiě)圖片描述

此時(shí)我若輸入用戶名:“錢(qián)春華”,密碼(假設(shè)輸入錯(cuò)誤的密碼)為:“123123”,則攔截器會(huì)攔截請(qǐng)求,并將請(qǐng)求重新轉(zhuǎn)發(fā)到登錄頁(yè)面,同時(shí)提示用戶“需要先登錄再訪問(wèn)網(wǎng)站”。如下圖所示:

這里寫(xiě)圖片描述

輸入正確的用戶名“錢(qián)春華”,密碼為“123456”后,顯示用戶登錄成功,而后跳轉(zhuǎn)到網(wǎng)頁(yè)的首頁(yè)。如下圖所示:

本文中的一些功能案例代碼和配置文件不是很完整,下面附上完整代碼:

FormController類(lèi)完整的代碼如下:

package cn.edu.jit.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;


/**
 * 動(dòng)態(tài)頁(yè)面跳轉(zhuǎn)控制器
 */
@Controller
public class FormController {

  @RequestMapping(value="/{formName}")
   public String loginForm(@PathVariable String formName){
    //動(dòng)態(tài)跳轉(zhuǎn)頁(yè)面
    return formName;
  }

}

在src文件下創(chuàng)建“cn.edu.jit.domain”包,用于存放圖書(shū)和用戶的兩個(gè)實(shí)例,具體代碼如下:

Book類(lèi)代碼:

package cn.edu.jit.domain;

import java.io.Serializable;
/**
 * 
 * @author 錢(qián)春華
 * 
 */
public class Book implements Serializable{

  private Integer id;//id 
  private String name;//書(shū)名
  private String author;//作者
  private Double price;//價(jià)格
  private String image;//封面圖片

  public Book() {
    super();
  }
  public Book( String image,String name, String author, Double price) {
    super();
    this.image = image;
    this.name = name;
    this.author = author;
    this.price = price;
  }
  public Integer getId() {
    return id;
  }
  public void setId(Integer id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getAuthor() {
    return author;
  }
  public void setAuthor(String author) {
    this.author = author;
  }

  public Double getPrice() {
    return price;
  }
  public void setPrice(Double price) {
    this.price = price;
  }
  public String getImage() {
    return image;
  }
  public void setImage(String image) {
    this.image = image;
  }
  @Override
  public String toString() {
    return "Book [id=" + id + ", name=" + name + ", author=" + author
        + ", price=" + price + ", image=" + image + "]";
  }

}

User類(lèi)代碼:

package cn.edu.jit.domain;

import java.io.Serializable;

public class User implements Serializable {

  private Integer id;//id
  private String loginname;//登錄名
  private String password;//密碼
  private String username;//用戶名

  public User() {
    super();
  }
  public Integer getId() {
    return id;
  }
  public void setId(Integer id) {
    this.id = id;
  }
  public String getLoginname() {
    return loginname;
  }
  public void setLoginname(String loginname) {
    this.loginname = loginname;
  }
  public String getPassword() {
    return password;
  }
  public void setPassword(String password) {
    this.password = password;
  }
  public String getUsername() {
    return username;
  }
  public void setUsername(String username) {
    this.username = username;
  }

  @Override
  public String toString() {
    return "User [id=" + id + ", loginname=" + loginname + ", password="
        + password + ", username=" + username + "]";
  }


}

springmvc-config.xml配置文件具體配置信息如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:p="http://www.springframework.org/schema/p"
  xmlns:mvc="http://www.springframework.org/schema/mvc"
  xmlns:context="http://www.springframework.org/schema/context"
  xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd   
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.2.xsd">

  <!-- spring可以自動(dòng)去掃描base-pack下面的包或者子包下面的java文件,
    如果掃描到有Spring的相關(guān)注解的類(lèi),則把這些類(lèi)注冊(cè)為Spring的bean -->
  <context:component-scan base-package="cn.edu.jit.controller"/>
   <!-- 設(shè)置默認(rèn)配置方案 -->
  <mvc:annotation-driven/>
  <!-- 使用默認(rèn)的Servlet來(lái)響應(yīng)靜態(tài)文件 -->
  <mvc:default-servlet-handler/>
  <!-- 視圖解析器 -->
   <bean id="viewResolver"
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <!-- 前綴 -->
    <property name="prefix">
      <value>/WEB-INF/content/</value>
    </property>
    <!-- 后綴 -->
    <property name="suffix">
      <value>.jsp</value>
    </property>
  </bean>

  <mvc:interceptors>
    <mvc:interceptor>
      <mvc:mapping path="/*"/>
      <!-- 使用bean定義一個(gè)Interceptor,直接定義在mvc:interceptors根下面的Interceptor將攔截所有的請(qǐng)求 --> 
      <bean class="cn.edu.jit.interceptor.AuthorizationInterceptor"/>
    </mvc:interceptor>
  </mvc:interceptors>

</beans>

web.xml配置文件具體配置信息如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
 <display-name>MultipartFileTest</display-name>

 <!-- 定義Spring MVC的前端控制器 -->
 <servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>
    org.springframework.web.servlet.DispatcherServlet
  </servlet-class>
  <init-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>/WEB-INF/springmvc-config.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
 </servlet>

 <!-- 讓Spring MVC的前端控制器攔截所有請(qǐng)求 -->
 <servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <url-pattern>/</url-pattern>
 </servlet-mapping>

 <!-- 編碼過(guò)濾器 -->
 <filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
 </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

</web-app>

總結(jié):今天主要就介紹Spring MVC攔截器,通過(guò)引用攔截器機(jī)制,Spring MVC框架可以使用可插拔方式管理各種功能。以上就是完整的使用Spring MVC攔截器實(shí)現(xiàn)了用戶的權(quán)限驗(yàn)證,本文所有的案例都是本人親自測(cè)試,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot+vue實(shí)現(xiàn)登錄圖片驗(yàn)證碼功能

    SpringBoot+vue實(shí)現(xiàn)登錄圖片驗(yàn)證碼功能

    這篇文章主要給大家介紹一下如何SpringBoot+vue實(shí)現(xiàn)登錄圖片驗(yàn)證碼功能,文中有詳細(xì)的代碼示例,具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-07-07
  • JDK動(dòng)態(tài)代理詳細(xì)解析

    JDK動(dòng)態(tài)代理詳細(xì)解析

    這篇文章主要介紹了JDK動(dòng)態(tài)代理詳細(xì)解析,在Java的動(dòng)態(tài)代理機(jī)制中,有兩個(gè)重要的類(lèi)和接口,一個(gè)是InvoInvocationHandler(接口)、Proxy(類(lèi)),這一個(gè)類(lèi)和接口是我們動(dòng)態(tài)代理所必須用到的,需要的朋友可以參考下
    2023-11-11
  • java如何獲取map中value的最大值

    java如何獲取map中value的最大值

    這篇文章主要介紹了java如何獲取map中value的最大值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 使用Feign實(shí)現(xiàn)微服務(wù)間文件下載

    使用Feign實(shí)現(xiàn)微服務(wù)間文件下載

    這篇文章主要為大家詳細(xì)介紹了使用Feign實(shí)現(xiàn)微服務(wù)間文件下載,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • mybatis中oracle實(shí)現(xiàn)分頁(yè)效果實(shí)例代碼

    mybatis中oracle實(shí)現(xiàn)分頁(yè)效果實(shí)例代碼

    實(shí)現(xiàn)分頁(yè)的方式有很多,但常用的是通過(guò)SQL來(lái)顯示分頁(yè)。這篇文章主要介紹了mybatis中oracle實(shí)現(xiàn)分頁(yè)效果實(shí)例代碼,有興趣的可以了解一下。
    2017-04-04
  • SpringBoot中的Spring Cloud Hystrix原理和用法詳解

    SpringBoot中的Spring Cloud Hystrix原理和用法詳解

    在Spring Cloud中,Hystrix是一個(gè)非常重要的組件,Hystrix可以幫助我們構(gòu)建具有韌性的分布式系統(tǒng),保證系統(tǒng)的可用性和穩(wěn)定性,在本文中,我們將介紹SpringBoot中的Hystrix,包括其原理和如何使用,需要的朋友可以參考下
    2023-07-07
  • 淺談關(guān)于Mybatis的mapper-locations配置問(wèn)題

    淺談關(guān)于Mybatis的mapper-locations配置問(wèn)題

    MyBatis 是一款優(yōu)秀的半自動(dòng)的ORM持久層框架,它支持自定義 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作,需要的朋友可以參考下
    2023-05-05
  • java編寫(xiě)全年考勤日歷

    java編寫(xiě)全年考勤日歷

    這篇文章主要為大家詳細(xì)介紹了java編寫(xiě)全年考勤日歷,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • Java封裝好的mail包發(fā)送電子郵件的類(lèi)

    Java封裝好的mail包發(fā)送電子郵件的類(lèi)

    本文給大家分享了2個(gè)java封裝好的mail包發(fā)送電子郵件的類(lèi),并附上使用方法,小伙伴們可以根據(jù)自己的需求自由選擇。
    2016-01-01
  • 如何實(shí)用Java實(shí)現(xiàn)合并、拆分PDF文檔

    如何實(shí)用Java實(shí)現(xiàn)合并、拆分PDF文檔

    這篇文章主要介紹了如何實(shí)用Java實(shí)現(xiàn)合并、拆分PDF文檔,處理PDF文檔時(shí),這樣的好處是對(duì)文檔的存儲(chǔ)、管理很方便。下面將通過(guò)Java程序代碼介紹具體的PDF合并、拆分的方法,需要的朋友可以參考下
    2019-07-07

最新評(píng)論