100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Spring MVC 的拦截器详解(登录案例实现)

Spring MVC 的拦截器详解(登录案例实现)

时间:2022-07-27 03:57:28

相关推荐

Spring MVC 的拦截器详解(登录案例实现)

Spring MVC 的拦截器详解(登录案例实现)

1、拦截器的定义实现HandlerInterceptor接口,或继承HandlerInterceptor接口的实现类(如HandlerInterceptorAdapter)来定义 2、拦截器的执行流程单拦截器单拦截器代码实现方式多拦截器多拦截器代码实现 3、拦截器的应用案例代码实现:

Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。

1、拦截器的定义

实现HandlerInterceptor接口,或继承HandlerInterceptor接口的实现类(如HandlerInterceptorAdapter)来定义

以实现HandlerInterceptor接口方式为例,自定义拦截器类的代码如下图所示:

2、拦截器的执行流程

在运行程序时,拦截器的执行是有一定顺序的,该顺序与配置文件中所定义的拦截器的顺序相关。

单拦截器

在程序中的执行流程如下图所示:

单拦截器代码实现方式

创建一个com.lzq.controllor包,新建一个Controllor类

package com.lzq.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;@Controllerpublic class HelloController {@RequestMapping("/hello")public String hello() {System.out.println("hello!");return "success";}}

创建一个com.lzq.Interceptor包,新建一个CustomerInterceptor的类,该类实现HandlerInterceptor接口,重写接口的方法

package com.lzq.Interceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;public class CustomerInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {System.out.println("Constomer preHandle");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {System.out.println("Constomer postHandle");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {System.out.println("Constomer afterCompletion");}}

在新建的web.xml文件,这是web项目当中的配置文件

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="/2001/XMLSchema-instance"xmlns="/xml/ns/javaee" xsi:schemaLocation="/xml/ns/javaee /xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><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-config.xml</param-value></init-param><!-- 在启动时立即加载servlet --><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping></web-app>

在src当中添加SpringMVC需要的配置文件:配置对应的xml文件

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:mvc="/schema/mvc"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-4.3.xsd/schema/mvc/schema/mvc/spring-mvc-4.3.xsd/schema/context /schema/context/spring-context-4.3.xsd"><!-- 指定需要扫描的包 --><context:component-scanbase-package="com.lzq.controller" /><!-- 定义视图解析器 --><bean id="viewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- 设置前缀 --><property name="prefix" value="/WEB-INF/jsp/" /><!-- 设置后缀 --><property name="suffix" value=".jsp" /></bean><!-- 配置拦截器 --><mvc:interceptors><bean class="com.lzq.Interceptor.CustomerInterceptor"></bean></mvc:interceptors></beans>

在WEB-INF文件夹下新建一个jsp文件夹,在里面新建一个success.jsp文件,文件内容自定义。

对需要的jar包进行添加,如下图:

运行项目在控制台当中进行查看:http://localhost:8080/Interceptor/hello

多拦截器

(假设有两个拦截器Interceptor1和Interceptor2,并且在配置文件中, Interceptor1拦截器配置在前),在程序中的执行流程如下图所示:

多拦截器代码实现

在前文的基础上添加俩个新的拦截器类,分别为Interceptor1和Interceptor2

随后在springmvc-config文件当中进行定义:如下图所示:

运行项目,打开对应的网址,发送请求:http://localhost:8080/Interceptor/hello在控制台当中查看输出,即方法执行的先后顺序。

3、拦截器的应用案例

在这个案例当中,只有登录后的用户才能访问系统中的主页面,如果没有登录系统而直接访问主页面,则拦截器会将请求拦截,并转发到登录页面,同时在登录页面中给出提示信息。如果用户名或密码错误,也会在登录页面给出相应的提示信息。当已登录的用户在系统主页中单击“退出”链接时,系统同样会回到登录页面。执行流程如下:

代码实现:

第一步:新建一个com.lzq.po包用于储存一个用户对象。对变量进行getter/setter封装,以下代码省略。

package com.lzq.po;public class User {private Integer id;private String username;private String password;}

第二步:在com.lzq.controller包当中进行创建一个UserController控制器类。实现对应的方法。

package com.lzq.controller;import javax.servlet.http.HttpSession;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import com.lzq.po.User;@Controllerpublic class UserController {@RequestMapping(value = "/login", method = RequestMethod.GET)public String toLogin() {return "login";}@RequestMapping(value = "/login", method = RequestMethod.POST)public String Login(User user, Model model, HttpSession session) {String username = user.getUsername();String password = user.getPassword();if (username != null & username.equals("huangyueyue") && password != null && password.equals("123456")) {session.setAttribute("USER", user);return "redirect:main";}model.addAttribute("msg", "账号密码有误,请重新登录!");return "login";}@RequestMapping(value = "/main")public String toMain() {return "main";}@RequestMapping(value = "/logout")public String Logout(HttpSession session) {session.invalidate();return "redirect:login";}}

第三步:在com.lzq.Interceptor包当中创建一个拦截器类:

package com.lzq.Interceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import com.lzq.po.User;public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {String url = request.getRequestURI();if (url.indexOf("/login")>=0) {return true;}HttpSession session = request.getSession();User user =(User) session.getAttribute("USER");if (user!=null) {return true;}request.setAttribute("msg", "账号密码有误,请重新登录!");request.getRequestDispatcher("WEB-INF/jsp/login.jsp").forward(request, response);;return false;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {}}

第四步:对springmvc-config.xml文件进行修改:配置新的拦截器

最后一步:添加相对应的jsp文件:

main.jsp

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%><!DOCTYPE html><html><head><meta charset="utf-8"><title>main.jsp</title></head><body>当前用户: ${USER.username}<a href="${pageContext.request.contextPath}/logout">退出</a></body></html>

login.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%><!DOCTYPE html><html><head><meta charset="utf-8"><title>login</title></head><body>${msg}<form action="${pageContext.request.contextPath}/login" method="POST">用户名: <input type="text" name="username" /><br /> 密 &nbsp;&nbsp;&nbsp;码 :<input type="password" name="password" /><br /> <input type="submit"value=" 登录" /></form></body></html>

运行项目查看效果:在使用huangyueyue和123456进行登录的时候才会有效果。以及当直接访问/login的时候会跳转到main

如果你会使用git工具,那么总体的代码案例可在Github当中获取:Https协议地址:/lizuoqun/Gitlzq.git其中的Interceptor文件夹即为测试案例代码

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。