如果一个用户想要修改自己的个人信息, 那么他必须是登录状态下进行的
本文章将会简单的配置一下拦截器的使用,以及一些简单介绍
环境
- idea
- spring 依赖均为 5.0.0.RELEASE 版本
- jdk 1.8
….
开始
SpringMVC提供了 Interceptor 拦截器几种机制:
- 实现
HandlerInterceptor
接口
- 继承实现了
HandlerInterceptor
接口的类
- 实现
WebRequestInterceptor
接口
- 继承实现了
WebRequestInterceptor
接口的类
我会使用实现HandlerInterceptor
接口的机制, 其他的可以到网上查资料,用法是差不多的
查看 HandlerInterceptor
接口源码:
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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: 执行 Handler 方法之前执行, 返回值是 Boolean 类型, 如果返回 false, 表示拦截请求,不再向下执行, 如果返回 true , 表示放行, 程序继续向下进行(如果后面没有其他拦截器,就会直接执行 controller 方法)
postHandle: 执行 Handler 之后, 返回 ModelAndView 之前执行
- afterCompletion: 执行完 Handler 之后执行, 由于是在 controller 方法执行完毕后执行该方法, 所以该方法适合进行统一的异常或者日志处理操作
创建登录拦截
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| package com.ujiuye.controller;
import com.ujiuye.domain.User; import com.ujiuye.exception.UserException; import com.ujiuye.service.IUserService; import org.springframework.beans.factory.annotation.Autowired; 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 {
@Autowired private IUserService userService;
@RequestMapping("login") public String login(String username, String password, HttpSession session, Model model) throws UserException { User user = userService.selectLogin(username, password); if (user!=null){ session.setAttribute("USER_IN_SESSION",user); return "redirect:/user/query.do"; }else { model.addAttribute("msg","用户名或者密码错误"); return "forward:/login.jsp"; } } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| package com.ujiuye.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(); Object user = session.getAttribute("USER_IN_SESSION"); if (user == null){ response.sendRedirect("login.jsp"); return false; } return true; } }
|
查看session是否有 USER_IN_SESSION 的key, 如果有就代表已经登陆, 反之;
配置全局拦截器
springMVC.xml 文件里
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <mvc:exclude-mapping path="/login.do"/> <bean class="com.ujiuye.interceptor.LoginInterceptor"></bean> </mvc:interceptor> <mvc:interceptor> </mvc:interceptor> <mvc:interceptor> </mvc:interceptor> </mvc:interceptors>
|
记得排除掉登录页面;
</mvc:interceptors>
: 标签下可以创建多个拦截器, 从上往下执行
总结
其实就是登录成功后在session放入一个key, 然后拦截器实现 HandlerInterceptor
接口, 实现里面的方法, 判断session是否存在登录的key, 有的话就是已登录, 没有就再跳回登录页面, 防止用户直接进入深一层的页面,
然后再springMVC.xml配置文件里配置一个全局拦截器,就ok了。
两种接口的区别
HandlerInterceptor
: 主要进行请求前, 和请求后的拦截
而WebRequestInterceptor
:针对请求的拦截器接口, 该接口中没有 response
(响应),所以该接口只进行请求数据的准备和处理
查看 WebRequestInterceptor
接口源码:
1 2 3 4 5 6 7 8 9 10
| public interface WebRequestInterceptor {
void preHandle(WebRequest request) throws Exception;
void postHandle(WebRequest request, @Nullable ModelMap model) throws Exception;
void afterCompletion(WebRequest request, @Nullable Exception ex) throws Exception;
}
|
个人博客: https://aaatao66.github.io/
掘金: https://juejin.im/user/5d187331f265da1bc5527953
这次的文章很短, 第二种接口的使用方法没有过多的描述, 如果想要知道可以到网上寻找相关资料