版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/carl_jiang/article/details/78862991
Intercepto拦截器在springmvc中也是非常重要的知识点,它的作用是拦截用户的请求并进行处理。比如,通过拦截器来进行用户权限的验证,或者用户是否已经登录等等。
如果要使用A拦截器,那么在配置文件中定义A拦截器,所以它也是可插拔的。接下来是一个小例子。用来拦截没有登录的用户,如果登录就进行访问信息。
User:
package model;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.Pattern;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable{
@NotBlank(message = "登录名不能为空")
private String loginName;
@NotBlank(message = "密码不能为空")
@Length(min=6,max = 8,message = "密码在6到8之间")
private String password;
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;
}
}
Book:
package model;
public class Book {
private String id;
private String name;
private String author;
public Book(){}
public Book(String id ,String name, String author){
this.id = id ;
this.name = name;
this.author = author;
}
public String getId() {
return id;
}
public void setId(String 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;
}
}
loginForms.jsp
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2017/12/20 0020
Time: 16:33
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<form action="logins" method="post">
<table>
<tr>
<td><label>用户名:</label></td>
<td><input name="loginName" type="text"></td>
</tr>
<tr>
<td><label>密码:</label></td>
<td><input name="password" type="password"></td>
</tr>
<tr><td><input type="submit" value="登录"></td></tr>
</table>
</form>
</body>
</html>
main.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2017/12/20 0020
Time: 17:25
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>欢迎[${sessionScope.user.loginName}]</h3>
<c:forEach items="${requestScope.books}" var="book">
<tr>
<td>id:${book.id}</td><br>
<td>name:${book.name}</td><br>
<td>author:${book.author}</td><br>
</tr>
</c:forEach>
</body>
</html>
LoginContriller.java
package controller;
import model.Book;
import model.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.List;
//如果没有登录的话,被拦截器拦截,不能进行其他的访问
@Controller
public class LoginController {
//1.进入登录页面
@RequestMapping("/loginForms")
public String login(){
return "loginForms";
}
// //或者可以写成通用的:
// @RequestMapping("/{formName}")
// public String formName(String forName){
// return forName;
// }
//2.登录
@RequestMapping("logins")
public ModelAndView login(String loginName, String password, ModelAndView mv, HttpSession session){
if(loginName!=null && loginName.equals("jkf") && password!=null && password.equals("123")){
User user= new User();
user.setLoginName(loginName);
user.setPassword(password);
session.setAttribute("user",user);
mv.setViewName("redirect:main"); //转发到main
}else{
mv.addObject("message","登录名或者密码错误!");
mv.setViewName("loginForms");
}
return mv;
}
@RequestMapping("main")
public String main(Model model){
//模拟数据库获得所有图书
List<Book> books = new ArrayList<Book>();
books.add(new Book("1","Java精通宝典","jkf"));
books.add(new Book("2","springmvc精通宝典","jkf"));
books.add(new Book("3","tomcat权威指南","jkf"));
model.addAttribute("books",books);
return "main";
}
}
拦截器:AuthorizationInterceptor.java
package interceptor;
import model.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AuthorizationInterceptor implements HandlerInterceptor{
String IGNORE_URL[] = {"/loginForms","/logins"}; //不拦截loginForms logins请求
//preHandler是处理拦截器使用,在controller之前执行! 该方法返回true才会继续执行,如果返回false就结束整个请求!
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//用于判断是否登录!
boolean flag = false;
//获取请求路径进行判断!
String sevletPath = request.getServletPath();
//判断请求是否需要拦截?
for(String s:IGNORE_URL){
if(sevletPath.equals(s)){
flag = true;
break;
}
}
//拦截请求!
if(!flag)
{
//获取HttpSession中的User对象!
User user = (User)request.getSession().getAttribute("user");
//判断是否已经登录
if(user==null){
request.setAttribute("message","请先登录");
request.getRequestDispatcher("loginForms").forward(request,response);
}
else{
//如果已经登录!
flag=true;
}
}
return flag;
}
//该方法在controller方法调用后执行
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("--- postHanlder ---");
}
//该方法在整个请求完成之后执行。 主要是清理资源。在当前拦截器的postHandle方法返回true才会执行这个方法。
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("--- afterCompletion ---");
}
}
Springmvc.xml配置文件中指明使用哪个拦截器:
<!--自定义拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/*"/>
<!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->
<bean class="interceptor.AuthorizationInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>