【JavaWeb】Spring Interceptor

参考博客:
https://www.cnblogs.com/Vincent-yuan/p/11280240.html

1. 定义一个实现 HandlerInterceptor 接口 的类
package edu.example.hello;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
@Component
public class HelloImgInterceptor implements HandlerInterceptor{
//在处理方法之前执行,一般用来做准备工作,比如日志、权限检查,false即被拦截,true继续,不会继续调用其他两个方法,此时我们需要通过 response 来产生响应
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler)throws Exception {
return (request.getSession().getAttribute("login") != null);
}
//在处理方法执行之后,在渲染视图执行之前执行,(即Controller 执行后,并且未返回 ModelAndView 前调用此方法)一般用来做一些清理工作
//这个方法必须所以的拦截器的 preHandle 方法都返回 true 才执行
@Override
public void postHandle(HttpServletRequest req, HttpServletResponse resp, Object handler, ModelAndView mv)
throws Exception {
System.out.println("执行postHandler");
}
// 在视图渲染后执行 一般用来释放资源 这个方法必须是 preHandle 返回 true 才执行。
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("执行afterCompletion");
}
}
package edu.example.hello;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@Component
public class HelloInterceptor implements HandlerInterceptor{
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler)throws Exception {
System.out.println(request.getParameter("no"));
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
List<Student> list = (List<Student>) modelAndView.getModel().get("list");//从视图拦截到的信息
for (Student student: list) {
System.out.printf("%s,%s,%d\n", student.getNo(), student.getName(), student.getAge());
}
}
}
2. 创建控制器 ,添加拦截器配置
package edu.example.hello;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class HelloConfigure implements WebMvcConfigurer{
@Autowired
private HelloInterceptor interceptor;
@Autowired
private HelloImgInterceptor imgInterceptor;//图片拦截
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(interceptor).addPathPatterns("/");
registry.addInterceptor(imgInterceptor).addPathPatterns("/**.png");
}
}
package edu.example.hello;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@Autowired
// private Student student;
private StudentFactory sf;
@GetMapping("/")
public String home(Model model) {
System.out.println("hello.get...");
model.addAttribute("list",sf.getStudents());
return "home";
}
@PostMapping("/")
public String home(Model model, String no) {
System.out.println("hello.post...");
model.addAttribute("list", sf.findBy(no));
return "home";
}
//如果1,则是登陆,如果0,是登出
@GetMapping("/login")
public String login(int type, HttpSession session) {
if (type == 1)
session.setAttribute("login", new Object());
else
session.removeAttribute("login");
return "home";
}
}
<html xmlns:th="http://www.thymeleaf.org">
<body>
<h2>Student...
<a href="login?type=1">login</a> <a href="login?type=0">logout</a></h2>
<!-- <ol>
<li th:each="st:${list}" th:text="${st.name}"></li>
动态会代替静态
</ol> -->
<img alt="spring" src="1.png">
<p>
<form action="" method="post">
no:<input type="text" name="no"/>
<input type="submit">
</form>
<table border="1">
<tr>
<th>No</th><th>Name</th><th>Age</th>
</tr>
<tr th:each="st:${list}">
<td th:text="${st.no}"></td><td th:text="${st.name}"></td><td th:text="${st.age}"></td>
</tr>
</table>
</body>
</html>

浙公网安备 33010602011771号