好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SpringMVC 拦截器的使用示例

简介

SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。

过滤器

servlet规范中的一部分,任何java web工程都可以使用 在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截

拦截器

拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用 拦截器只会拦截访问的控制器方法, 如果访问的是jsp/html/css/image/js是不会进行拦截的

过滤器与拦截器的区别:

拦截器是AOP思想的具体应用。

拦截器初体验

1.新建一个项目,添加web支持,在IDEA导入该项目依赖的lib包。

2.配置web.xml

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

<? xml version = "1.0" encoding = "UTF-8" ?>

< web-app xmlns = "http://xmlns.jcp.org/xml/ns/javaee"

          xmlns:xsi = "http://HdhCmsTestw3.org/2001/XMLSchema-instance"

          xsi:schemaLocation = "http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"

          version = "4.0" >

     < servlet >

         < servlet-name >springmvc</ servlet-name >

         < servlet-class >org.springframework.web.servlet.DispatcherServlet</ servlet-class >

         < init-param >

             < param-name >contextConfigLocation</ param-name >

             < param-value >classpath:springmvc-servlet.xml</ param-value >

         </ init-param >

         < load-on-startup >1</ load-on-startup >

     </ servlet >

     < servlet-mapping >

         < servlet-name >springmvc</ servlet-name >

         < url-pattern >/</ url-pattern >

     </ servlet-mapping >

 

     < filter >

         < filter-name >encoding</ 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 >encoding</ filter-name >

         < url-pattern >/*</ url-pattern >

     </ filter-mapping >

 

 

</ web-app >

3.配置springmvc-servlet.xml

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

<? xml version = "1.0" encoding = "UTF-8" ?>

< beans xmlns = "http://HdhCmsTestspringframework.org/schema/beans"

        xmlns:xsi = "http://HdhCmsTestw3.org/2001/XMLSchema-instance"

        xmlns:context = "http://HdhCmsTestspringframework.org/schema/context"

        xmlns:mvc = "http://HdhCmsTestspringframework.org/schema/mvc"

        xsi:schemaLocation="http://HdhCmsTestspringframework.org/schema/beans

              http://HdhCmsTestspringframework.org/schema/beans/spring-beans.xsd

              http://HdhCmsTestspringframework.org/schema/context

              http://HdhCmsTestspringframework.org/schema/context/spring-context.xsd

              http://HdhCmsTestspringframework.org/schema/mvc

              http://HdhCmsTestspringframework.org/schema/mvc/spring-mvc.xsd">

     <!-- 扫描指定包,让指定包下的注解生效   -->

     < context:component-scan base-package = "controller" />

     < mvc:annotation-driven />

 

     <!-- JSON解决乱码-->

     < mvc:annotation-driven >

         < mvc:message-converters register-defaults = "true" >

             < bean class = "org.springframework.http.converter.StringHttpMessageConverter" >

                 < constructor-arg value = "UTF-8" />

             </ bean >

             < bean class = "org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" >

                 < property name = "objectMapper" >

                     < bean class = "org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean" >

                         < property name = "failOnEmptyBeans" value = "false" />

                     </ bean >

                 </ property >

             </ bean >

         </ mvc:message-converters >

     </ mvc:annotation-driven >

 

     <!-- 视图解析器   -->

     < bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver" id = "internalResourceViewResolver" >

         < property name = "prefix" value = "/WEB-INF/jsp/" />

         < property name = "suffix" value = ".jsp" />

     </ bean >

 

</ beans >

4.编写自定义的拦截器。(实现HandlerInterceptor接口)

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

package interceptor;

 

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class MyInterceptor implements HandlerInterceptor {

 

     //在请求处理的方法之前执行

     //如果返回true执行下一个拦截器

     //如果返回false就不执行下一个拦截器

     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

         System.out.println( "------------处理前------------" );

         return true ;

     }

     //在请求处理方法执行之后执行

     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

         System.out.println( "------------处理后------------" );

     }

     //在dispatcherServlet处理后执行,做清理工作.

     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

         System.out.println( "------------清理------------" );

     }

}

事实上,只要重写preHandle方法就可以。

5.在springmvc-servlet.xml文件中配置拦截器

?

1

2

3

4

5

6

7

8

9

10

11

<!--关于拦截器的配置-->

< mvc:interceptors >

     < mvc:interceptor >

         <!--/** 包括路径及其子路径-->

         <!--/admin/* 拦截的是/admin/add等等这种 , /admin/add/user不会被拦截-->

         <!--/admin/** 拦截的是/admin/下的所有-->

         < mvc:mapping path = "/**" />

         <!--bean配置的就是拦截器-->

         < bean class = "interceptor.MyInterceptor" />

     </ mvc:interceptor >

</ mvc:interceptors >

6.编写controller

?

1

2

3

4

5

6

7

8

9

10

11

12

13

package controller;

 

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

 

@RestController

public class InterceptorController {

     @RequestMapping ( "/interceptor" )

     public String test(){

         System.out.println( "InterceptorController" );

         return "ok" ;

     }

}

7.配置Tomcat,进行测试

初体验:自定义拦截器实现了HandlerInterceptor接口,重写了preHandle方法。在preHandle方法中,返回值决定了是否拦截,当返回值为true时,不拦截;反之则拦截。

8.结果:

返回值为true,拦截器不拦截,跳转 返回值为false,拦截器拦截,不跳转

拦截器再体验-登录验证

实现思路

有一个登陆页面,需要写一个controller访问页面。 登陆页面有一提交表单的动作。需要在controller中处理。判断用户名密码是否正确。如果正确,向session中写入用户信息。返回登陆成功。 拦截用户请求,判断用户是否登陆。如果用户已经登陆。放行, 如果用户未登陆,跳转到登陆页面

登录界面

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<%@ page contentType= "text/html;charset=UTF-8" language= "java" %>

<html>

<head>

    <title>Title</title>

</head>

 

<h1>登录页面</h1>

<hr>

 

<body>

<form action= "${pageContext.request.contextPath}/user/login" >

   用户名:<input type= "text" name= "username" > <br>

   密码:<input type= "password" name= "pwd" > <br>

    <input type= "submit" value= "提交" >

</form>

</body>

</html>

controller处理请求

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

package controller;

 

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

 

import javax.servlet.http.HttpSession;

 

@Controller

@RequestMapping ( "/user" )

public class UserController {

 

    //跳转到登陆页面

    @RequestMapping ( "/jumplogin" )

    public String jumpLogin() throws Exception {

        return "login" ;

   }

 

    //跳转到成功页面

    @RequestMapping ( "/jumpSuccess" )

    public String jumpSuccess() throws Exception {

        return "success" ;

   }

 

    //登陆提交

    @RequestMapping ( "/login" )

    public String login(HttpSession session, String username, String pwd) throws Exception {

        // 向session记录用户身份信息

        System.out.println( "接收前端===" +username);

        session.setAttribute( "user" , username);

        return "success" ;

   }

 

    //退出登陆

    @RequestMapping ( "logout" )

    public String logout(HttpSession session) throws Exception {

        // session 过期

        session.invalidate();

        return "login" ;

   }

}

登录成功页面

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<%@ page contentType= "text/html;charset=UTF-8" language= "java" %>

<html>

<head>

    <title>Title</title>

</head>

<body>

 

<h1>登录成功页面</h1>

<hr>

 

${user}

<a href= "${pageContext.request.contextPath}/user/logout" >注销</a>

</body>

</html>

index页面

?

1

2

3

4

5

6

7

8

9

10

11

12

13

<%@ page contentType= "text/html;charset=UTF-8" language= "java" %>

<html>

  <head>

    <title>$Title$</title>

  </head>

  <body>

  <h1>首页</h1>

  <hr>

<%--登录--%>

  <a href= "${pageContext.request.contextPath}/user/jumplogin" >登录</a>

  <a href= "${pageContext.request.contextPath}/user/jumpSuccess" >成功页面</a>

  </body>

</html>

index页面

?

1

2

3

4

5

6

7

8

9

10

11

12

13

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

< html >

  < head >

    < title >$Title$</ title >

  </ head >

  < body >

  < h1 >首页</ h1 >

  < hr >

<%--登录--%>

  < a href = "${pageContext.request.contextPath}/user/jumplogin" >登录</ a >

  < a href = "${pageContext.request.contextPath}/user/jumpSuccess" >成功页面</ a >

  </ body >

</ html >

编写控制器

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

package interceptor;

 

import org.springframework.web.servlet.HandlerInterceptor;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

public class LoginInterceptor implements HandlerInterceptor {

     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

         if (request.getRequestURI().contains( "login" )) {

             return true ;

         }

 

         HttpSession session = request.getSession();

 

         // 如果用户已登陆,不拦截

         if (session.getAttribute( "user" ) != null ) {

             return true ;

         }

 

         // 用户没有登陆,拦截,并跳转到登陆页面

         request.getRequestDispatcher( "/WEB-INF/jsp/login.jsp" ).forward(request, response);

         return false ;

     }

}

在springmvc-servlet.xml配置拦截器

?

1

2

3

4

< mvc:interceptor >

             < mvc:mapping path = "/**" />

             < bean id = "loginInterceptor" class = "interceptor.LoginInterceptor" />

         </ mvc:interceptor >

配置Tomcat,测试。

结果:没有登录就无法直接访问登陆成功页面。

以上就是SpringMVC 中文乱码的解决方案的详细内容,更多关于SpringMVC 中文乱码的资料请关注其它相关文章!

原文链接:https://juejin.cn/post/6944667529717481485

查看更多关于SpringMVC 拦截器的使用示例的详细内容...

  阅读:24次