06SpringMVC----拦截器
目录
实例应用
实现
index.jsp
1、编写一个登陆页面 login.jsp WEB-INF-jsp下
2、编写一个首页 main.jsp WEB-INF-jsp下
3、编写一个Controller处理请求
4、在 index 页面上测试跳转!启动Tomcat 测试,未登录也可以进入主页!
5、编写用户登录拦截器
6、在springmvc的配置文件中配置拦截器
过滤器与拦截器的区别:拦截器是AOP思想的具体应用。
过滤器
-
servlet规范中的一部分,任何java web工程都可以使用
-
在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截
拦截器
-
拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用
-
拦截器只会拦截访问的控制器方法, 如果访问的是jsp/html/css/image/js是不会进行拦截的
自定义拦截器
那如何实现拦截器呢?
想要自定义拦截器,必须实现 HandlerInterceptor 接口。
1、新建一个Moudule 添加web支持
2、配置web.xml 和 springmvc-servlet.xml 文件
3、编写一个拦截器
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 { //return ture 执行下一个拦截器 //return false 不执行下一个拦截器 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("========处理前============"); return true; } //日志 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("========处理后============"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("========清理============"); }}
4、在springmvc的配置文件中配置拦截器
5、编写一个Controller,接收请求
@RestControllerpublic class TestController { @GetMapping("/t1") public String test(){ System.out.println("TestController test方法执行了"); return "ok"; }}
6、前端 index.jsp
拦截器测试
实例应用
验证用户是否登录 (认证用户)
实现思路
1、有一个登陆页面,需要写一个controller访问页面。
2、登陆页面有一提交表单的动作。需要在controller中处理。判断用户名密码是否正确。如果正确,向session中写入用户信息。返回登陆成功。
3、拦截用户请求,判断用户是否登陆。如果用户已经登陆。放行, 如果用户未登陆,跳转到登陆页面
实现
在 WEB-INF 下得所有页面或者资源,无法直接访问,只能通过controller来调用
index.jsp
Title 登录页面
欢迎来到我得世界
登录页面
首页
1、编写一个登陆页面 login.jsp WEB-INF-jsp下
Title 登录页面
用户名: 密码:
2、编写一个首页 main.jsp WEB-INF-jsp下
Title 首页
${username}
3、编写一个Controller处理请求
import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpSession;/** * @author gh Email:@2495140780qq.com * @Description * @date 2022-01-21-下午 9:18 */@Controller@RequestMapping("user")public class LoginController { @RequestMapping("/main") public String main() { return "main"; } @RequestMapping("/goLogin") public String goLogin() { return "login"; } @RequestMapping("/login") public String login(String username, String password, HttpSession session, Model model) { //把用户的信息存放在session中 session.setAttribute("userLoginInfo",username); model.addAttribute("username", username); return "main"; } @RequestMapping("/ghOut") public String ghOut( HttpSession session) { session.removeAttribute("userLoginInfo"); return "main"; }}
4、在 index 页面上测试跳转!启动Tomcat 测试,未登录也可以进入主页!
5、编写用户登录拦截器
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 { @Override 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; } //第一个登录也没有session //session 有数据 登录状态 if (session.getAttribute("userLoginInfo")!=null){ return true; } //判断什么情况下没有登录 request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response); return false; }}
6、在springmvc的配置文件中配置拦截器