springmvc 拦截器interceptor

版权声明:本文为博主原创文章,未经博主允许不得转载。 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>


猜你喜欢

转载自blog.csdn.net/carl_jiang/article/details/78862991