【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>