SpringMVC——自定义拦截器


拦截器
    Interceptor拦截器的主要作用是拦截用户的请求并进行相应的处理。SpringMVC拦截器是可插拔式的设计,在配置文件中配置或取消即可。
    HandlerInterceptor接口:
        Interceptor拦截器拦截请求是通过实现HandlerInterceptor接口实现的。定义一个Interceptor拦截器通常在该类中实现HandlerInterceptor接口,或者继承抽象类HandlerInterceptorAdapter。
        HandlerInterceptor接口中定义了三个方法:
          boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handle) 该方法在请求处理之前被调用。返回false表示请求结束,后续的Interceptor和Controller都不会再执行;当返回值为true时,就会继续调用下一个Interceptor的preHandle方法,若已经是最后一个Interceptor,就会调用当前请求的Controller。
          void postHandle(HttpServletRequest request,HttpServletResponse response,Object handler,ModelAndView mv) 该方法只能在当前所属的interceptor的preHandle方法返回true之后才能被调用。在Controller方法之后DispatherServlet进行视图返回渲染之前执行,可以对Controller方法返回的ModelAndView对象进行操作。先声明该方法的Interceptor会后执行。
          void afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handler,Exception exception) 该方法会在当前所属Interceptor的prehandle方法返回true时执行。该方法在DispatcherServlet渲染了对应的视图之后执行。
   

Bean

/FileUploadTest/src/com/spring/file/bean/Book.java

package com.spring.file.bean;

public class Book {
    private String name;
    private String author;
    private double price;
    
    public Book( String name, String author, double price) {
        super();
        this.name = name;
        this.author = author;
        this.price = price;
    }
//省略getter和setter方法 }

 

/FileUploadTest/src/com/spring/file/bean/User.java

package com.spring.file.bean;

import org.springframework.web.multipart.MultipartFile;

public class User {
    private String loginname;
    private String password;
    private String username;
    private MultipartFile image;
//省略getter和setter方法
}

配置文件

/FileUploadTest/WebContent/WEB-INF/springmvc-config.xml

 <!-- Spring MVC 拦截器定义 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <!-- 拦截所有请求 -->
            <mvc:mapping path="/*"/>
            <!-- 使用bean定义一个Interceptor -->
            <bean class="com.spring.file.controller.AuthorizationInterceptor" />
        </mvc:interceptor>
    </mvc:interceptors>

拦截器

/FileUploadTest/src/com/spring/file/controller/AuthorizationInterceptor.java

package com.spring.file.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.spring.file.bean.User;

/**
 * 拦截器必须实现HandlerInterceptor接口
 */
public class AuthorizationInterceptor implements HandlerInterceptor{
    //不拦截的请求
    private static final String[] IGNORE_URI = {"/login","/loginForm"};
    
    /*该方法将在整个请求完成后执行,主要用于清理资源,该方法只能在当前Interceptor的preHandle方法返回值为true时才会执行*/
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception)
            throws Exception {
        System.out.println("AuthorizationInterceptor afterCompletion -->");
    }
    /*该方法将在Controller调用之后执行,可以对ModelAndView进行操作。priHandle返回true时才会执行*/
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mv)
            throws Exception {
        System.out.println("AuthorizationInterceptor postHandle -->");
    }
    /*该方法进行处理器拦截,该方法将在Controller处理之前调用。该方法返回true拦截器才会继续往下执行,返回false整个请求结束*/
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("AuthorizationInterceptor preHandle -->");
        //flag判断用户是否登录
        boolean flag = false;
        //获取请求的路径进行判断
        String servletPath= request.getServletPath();
        //判断是否需要拦截请求
        for(String s : IGNORE_URI) {
            if(servletPath.contains(s)) {
                flag = true;
                break;
            }
        }
        //拦截请求
        if(!flag) {
            //获取session总的用户
            User user = (User) request.getSession().getAttribute("user");
            //判断是否登录
            if(user == null) {
                //用户没登录
                System.out.println("AuthorizationInterceptor拦截请求:");
                request.setAttribute("message", "请先登录!");
                request.getRequestDispatcher("login").forward(request, response);
            }else {
                //已登录
                System.out.println("AuthorizationInterceptor放行请求:");
                flag = true;
            }
        }
        return flag;
    }
    
}

Controller

/FileUploadTest/src/com/spring/file/controller/BookController.java

package com.spring.file.controller;

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

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.spring.file.bean.Book;

@Controller
public class BookController {
    @RequestMapping(value="main")
    public String main(Model model) {
        //模拟数据
        List<Book> bookList = new ArrayList<Book>();
        bookList.add(new Book("java","小明",77.2));
        bookList.add(new Book("javaee","小明",19.9));
        bookList.add(new Book("android","小明",29.9));
        bookList.add(new Book("ajax","小明",39.9));
        model.addAttribute("bookList", bookList);
        return "mainForm";
    }
}

 

/FileUploadTest/src/com/spring/file/controller/UserController.java

package com.spring.file.controller;

import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.spring.file.bean.User;

@Controller
public class UserController {
    
    @RequestMapping(value="/login")
    public ModelAndView login(String loginname,String password,ModelAndView mv,HttpSession session) {
        //模拟数据
        if(loginname != null && loginname.equals("hello")
                && password!=null && password.equals("123456")) {
            //创建用户
            User user = new User();
            user.setLoginname(loginname);
            user.setPassword(password);
            user.setUsername("管理员");
            //登录成功,将user对象设置到HttpSession作用域
            session.setAttribute("user", user);
            //转发到main请求
            mv.setViewName("redirect:main");
        }else {
            mv.addObject("message","登录失败!");
            mv.setViewName("loginForm");
        }
        
        return mv;
    }
}

JSP

/FileUploadTest/WebContent/WEB-INF/content/loginForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
    <h3>登录页面</h3>
    <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>

 

/FileUploadTest/WebContent/WEB-INF/content/mainForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>main</title>
</head>
<body>
<h3>欢迎[ ${sessionScope.user.username}]访问</h3><br>
<table border="1">
  <tr>
    <th>书名</th><th>作者</th><th>价格</th>
  </tr>
  <c:forEach items="${requestScope.bookList}" var="book">
    <tr>
      <td>${book.name}</td>
      <td>${book.author}</td>
      <td>${book.price}</td>
    </tr>
  </c:forEach>
</table>
</body>
</html>

测试结果:

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM