SpringMVC中的拦截器

Spring MVC 的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。

用户可以自己定义一些拦截器来实现特定的功能。

拦截器链(Interceptor Chain)就是将拦截器按一定的顺序联结成一条链。

在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

拦截器和过滤器的区别:

  过滤器是servlet规范中的一部分,任何java web工程都可以使用。

  拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能用。

  过滤器在url-pattern中配置了/*之后,可以对所有要访问的资源拦截。

  拦截器它是只会拦截访问的控制器方法,如果访问的是jsp,html,css,image或者js是不会进行拦截的。

想自定义拦截器, 要求必须实现:HandlerInterceptor接口

需求:

未登陆状态下点击首页Login

可以登录

如果已经登陆 , 点击login直接跳转到个人中心页面

编写拦截器   实现HandlerInterceptor接口

public class MyInterceptor implements HandlerInterceptor {
        /**
     * 预处理 controller方法执行前执行
     * return true 放行 ,执行下一个拦截器, 如果没有, 执行controller中的方法
     * return false  不放行, 可以直接跳转到其他页面
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle (HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println ("preHandle....");
        HttpSession session = request.getSession ();
        //如果用户名已存在,直接跳转到个人中心页面
        if (null!=session.getAttribute ("username")){
            request.getRequestDispatcher("/WEB-INF/pages/PersonalCenter.jsp").forward(request, response);
            return false;
        }
        //用户名不存在,用户未登陆, 可以进入登录页面,进行登录
        return true;
    }

    /**
     * 后处理方法, controller方法执行后, 跳转到对应页面之前
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle (HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println ("postHandle...");
    }

    @Override
    public void afterCompletion (HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println ("afterCompletion..");
    }
}

控制器代码

@Controller
@RequestMapping("/UserControl")
public class UserController {

    //跳转到登录页面
    @RequestMapping("/GoLogin")
    public String GoLogin() throws Exception{
        System.out.println ("now begin jump Login page");
        return "Login";
    }

    @RequestMapping("/Login")
    //登录操作
    public String Login(User user,HttpSession session){
        System.out.println (user);
        //如果登录成功, 把用户名存进session域对象中
        session.setAttribute ("username",user.getUsername ());
        //跳转到个人中心
        System.out.println ("now begin jump PersonalCenter page");
        return "PersonalCenter";
    }

    @RequestMapping("/Logout")
    public String Logout(HttpSession session) throws Exception{
        System.out.println ("Logout....");
        //session过期
        session.invalidate ();
        System.out.println ("now begin jump index page");
        return "redirect:../index.jsp";
    }
}

在Spring的配置文件springmvc.xml中  配置拦截器

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

    <!-- 开启注解扫描 -->
    <context:component-scan base-package="com.mkl"/>

    <!-- 视图解析器对象 -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <!--前端控制器,哪些静态资源不拦截-->
    <!-- 不处理静态内容 -->
    <mvc:default-servlet-handler/>
    <mvc:resources location="/css/" mapping="/css/**"/>
    <mvc:resources location="/images/" mapping="/images/**"/>
    <mvc:resources location="/js/" mapping="/js/**"/>

    <!-- 开启SpringMVC框架注解的支持 -->
    <mvc:annotation-driven />
    <!--配置拦截器-->
    <!--配置拦截器-->
    <mvc:interceptors>
        <!--配置拦截器-->
        <mvc:interceptor>
            <!--要拦截的具体的方法-->
            <mvc:mapping path="/UserControl/GoLogin"/>
            <mvc:mapping path="/UserControl/Login"/>
            <!--不要拦截的方法-->
            <!--<mvc:exclude-mapping path=""/>-->
            <!--配置拦截器对象-->
            <bean class="com.mkl.interceptor.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

</beans>

web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>

  <!--配置解决中文乱码的过滤器-->
  <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>

  <!--配置前端控制器-->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

</web-app>

原文地址:https://www.cnblogs.com/mkl7/p/10805655.html

时间: 2024-10-09 16:49:32

SpringMVC中的拦截器的相关文章

【SpringMVC学习11】SpringMVC中的拦截器

Springmvc的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理.本文主要总结一下springmvc中拦截器是如何定义的,以及测试拦截器的执行情况和使用方法. 1. springmvc拦截器的定义和配置 1.1 springmvc拦截器的定义 在springmvc中,定义拦截器要实现HandlerInterceptor接口,并实现该接口中提供的三个方法,如下: //测试拦截器1 public class HandlerInterceptor1 im

在SpringMVC中使用拦截器(interceptor)拦截CSRF攻击

关于什么是CSRF我这里就不多说了,以前转载的一篇文章(PS:https://www.zifangsky.cn/358.html)已经说得很清楚了.这里只是简单介绍如何在SpringMVC中使用拦截器拦截CSRF攻击.具体代码如下: (1)登录页面: <%@page import="java.security.SecureRandom"%> <%@ page language="java" contentType="text/html; 

SpringMVC学习(十二)——SpringMVC中的拦截器

SpringMVC学习(十二)--SpringMVC中的拦截器 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理.本文主要总结一下SpringMVC中拦截器是如何定义的,以及测试拦截器的执行情况和使用方法. SpringMVC中拦截器的定义和配置 SpringMVC中拦截器的定义 在SpringMVC中,定义拦截器要实现HandlerInterceptor接口,并实现该接口中提供的三个方法,如下: public class Inter

springmvc中自定义拦截器以及拦截器的执行过程

1.拦截器在一次请求中的执行流程 2.拦截器入门案例 2.1springMVC.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:m

SpringMVC(AbstractController,拦截器,注解)

1.Controller接口及其实现类 Controller是控制器/处理器接口,只有一个方法handleRequest,用于进行请求的功能处理(功能处理方法),处理完请求后返回ModelAndView对象(Model模型数据部分 和 View视图部分). 如果想直接在处理器/控制器里使用response向客户端写回数据,可以通过返回null来告诉DispatcherServlet我们已经写出响应了,不需要它进行视图解析 Spring默认提供了一些Controller接口的实现类以方便我们使用,

SpringMVC学习16-springmvc拦截器

1.定义拦截器 定义拦截器,实现HandlerInterceptor接口.接口中提供三个方法. public class HandlerInterceptor1 implements HandlerInterceptor { //进入 Handler方法之前执行 //用于身份认证.身份授权 //比如身份认证,如果认证不通过表示当前用户没有登陆,需要此方法拦截不再向下执行 @Override public boolean preHandle(HttpServletRequest request,

Spring MVC中的拦截器Interceptor

谈谈spring中的拦截器 在web开发中,拦截器是经常用到的功能.它可以帮我们验证是否登陆.预先设置数据以及统计方法的执行效率等等.今天就来详细的谈一下spring中的拦截器.spring中拦截器主要分两种,一个是HandlerInterceptor,一个是MethodInterceptor. 一,HandlerInterceptor拦截器 HandlerInterceptor是springMVC项目中的拦截器,它拦截的目标是请求的地址,比MethodInterceptor先执行.实现一个Ha

&lt;SpringMvc&gt;入门七 拦截器

什么是拦截器 1.SpringMVC框架中的拦截器用于 对处理器 进行预处理和后处理的技术. 2.可以定义拦截器链,按照顺序执行. 3.拦截器和过滤器功能类似,区别在 拦截器 过滤器 过滤器是Servlet规范的一部分,任何框架都可以使用过滤技术. 而拦截器是SpringMVC框架独有的 过滤器配置了/*,可以拦截任何资源 拦截器只对controller中的方法进行拦截 4.拦截器也是AOP思想的一种实现方式 5.想要定义拦截器,需要实现HandlerInterceptor接口 怎么使用拦截器

在springboot中使用拦截器

在springMVC中可以实现拦截器,是通过实现HandlerInterceptor接口,然后在springmvc-web.xml中配置就可以使用拦截器了.在springboot中拦截器也是一样的思想,使用方法还是没有变,只不过是配置稍微变了一下. 在springboot中使用拦截器步骤如下: 1.按照springmvc模式写一个拦截器类 和springmvc一样,也要写一个类实现HandlerInterceptor接口,然后重新其中的prehandle方法. 2.然后写一个配置类,继承WebM