在SpringMVC中的拦截器和Servlet过滤器Filter有些相似,可以对处理器进行预处理和后处理。
我们可以自定义自己的拦截器,我们可以继承实现了HandlerInterceptor接口的类。
在HandlerInterceptor中有三个方法:
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
首先,preHandle()方法会在业务处理器处理请求之前被调用,返回值是boolean类型。当返回值为false时,表示请求结束,后续的HandlerInterceptor以及Controller的方法都不会执行;当返回值为true时,preHandle()放行,会一次执行后续的HandlerInterceptor以及Controller的方法;
其次,postHandle()方法会在请求方法执行之后被调用,也就是Controller方法执行之后被调用。postHandle()会在DispatcherServlet 进行视图返回渲染之前被调用;
然后,afterCompletion()方法在整个请求结束后才执行,用于资源的清理。
在springmvc.xml文件中配置拦截器:
写一个TestController测试:
package com.yhx.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@GetMapping("/t1")
public String test() {
System.out.println("TestController==>test()执行了");
return "OK";
}
}
我们可以用拦截器帮助我们实现一个用户登录的功能,如果不使用拦截器直接写登录的话,就可以不填密码就可以进行登录了。通过直接在url上输入对应请求就可以跳过登录,这样就与我们的设计不符合了,设置登录就是为了身份验证,这样就没有达到我们的需求。
新建一个maven项目,命名为Login:
pom.xml:
SpringMVC
com.yhx
1.0-SNAPSHOT
4.0.0
Login
junit
junit
4.12
org.springframework
spring-webmvc
5.1.9.RELEASE
javax.servlet
servlet-api
2.5
javax.servlet.jsp
jsp-api
2.2
javax.servlet
jstl
1.2
src/main/java
**/*.properties
**/*.xml
false
src/main/resources
**/*.properties
**/*.xml
false
web.xml:
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:applicationContext.xml
1
springmvc
/
encoding
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
encoding
/*
applicationContext.xml:
编写一个登录页:
login.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
${msg}
编写一个首页main.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
${msg}
注销
写一个登录的控制器LoginController.java:
package com.yhx.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpSession;
@Controller
public class LoginController {
@RequestMapping("/main")
public String main() {
return "main";
}
@RequestMapping("/goLogin")
public String login() {
return "login";
}
@RequestMapping("/login")
public String login(HttpSession session, String username, String password , Model model) {
if (username.equals("admin")&&password.equals("123456")) {
session.setAttribute("user",username);
session.setAttribute("username",username);
session.setAttribute("password",password);
model.addAttribute("msg","登录成功");
return "main";
} else {
model.addAttribute("msg","登录失败");
return "login";
}
}
@RequestMapping("/goOut")
public String goOUt(HttpSession session) {
session.invalidate();
return "login";
}
}
拦截器LoginInterceptor.java:
package com.yhx.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 {
HttpSession session = request.getSession();
if (request.getRequestURI().contains("goLogin")) {
return true;
}
if (request.getRequestURI().contains("login")) {
return true;
}
if (session.getAttribute("user")!=null) {
return true;
} else {
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
return false;
}
}
}
服务器的欢迎首页index.jsp直接到goLogin请求:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
$Title$
项目的目录结构如下:
直接输入main并不会跳转:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)