Spring MVC拦截器

来源:互联网 发布:淘宝牛仔女裤 编辑:程序博客网 时间:2024/04/30 00:03

Spring MVC拦截器的使用

Spring MVC中拦截器(Interceptor)是比较重要的功能,主要作用是拦截用户的请求并根据实际需求以做出相应的处理。一般常用来用户权限验证、若需要同一账号只能登录一次还可以做是否已经登录判断等。Struts2也有类似拦截器,而在Servlet中主要通过过滤器实现。

Spring MVC中拦截器是通过实现HandlerInterceptor接口完成的。要想使用拦截器,可以直接实现该接口,或者继承实现了该接口的抽象类HandlerInterceptorAdapter。

以下以用户权限验证为例:

1.登录页面loginUI.jsp

输入用户名、密码,提交给后台处理,若用户名、密码错误时提示信息通过message显示。

<h1>${requestScope.message}</h1><form id="loginForm" action="${pageContext.request.contextPath}/user/login.do" method="post"><table><tr><td>用户名</td><td><input type="text" name="username"></td></tr><tr><td>密码</td><td><input type="password" name="pwd"></td></tr><tr><td colspan="2"><input type="submit" value="登录"></td></tr></table></form>

2.处理登录请求UserController.java

登录页面在WEB-INF/jsp/user目录下,所以需通过控制器转发;登录页面点击登录,判断用户名、密码是否正确,正确则session中存储登录用户;否则返回到登录页面,给出提示信息。

@Controller@RequestMapping("/user")public class UserController {/*** 用户登录页面*/@RequestMapping("/loginUI")public String loginUI() throws Exception {return "user/loginUI";}/*** 用户登录*/@RequestMapping("/login")public String login(Model model, HttpSession session, User user) throws Exception {if (user != null && StringUtils.isNotBlank(user.getUsername()) && StringUtils.isNotBlank(user.getPwd())) {// 模拟用户登录if (user.getUsername().equals("user") && user.getPwd().equals("user")) {// 登录成功,session域中存储登录用户session.setAttribute("user", user);model.addAttribute("message", "登录成功");return "success";}}model.addAttribute("message", "用户或密码错误");return "user/loginUI";}}

3.拦截器RequestInterceptor.java

拦截所有以".do"后缀结尾的请求,对于请求登录页面,首页等页面时放行;其他页面时则需判断用户是否已经登录,即session中是否有用户信息,已登录则放行,否则跳转进入登录页面。

/** * 请求拦截器 */public class RequestInterceptor implements HandlerInterceptor {private static final String[] IGNORE_URI = { "/loginUI", "/login", "/index" };/** * 请求拦截 * @param request * @param response * @param handler * @return true:执行下一拦截器或Controller;false:请求结束 * <p> *  1.preHandle方法是拦截器拦截到请求后最先执行的,所以可以在该方法中进行一些初始化或者拦截操作,如权限过滤。<br> *  2.Spring MVC是链式调用,即可以存在多个拦截器进行拦截,只有在preHandle返回true时,才会继续执行下一个拦截器或者Controller;<br> * </p> * */@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {boolean result = false;String uri = request.getRequestURI();for (String u : IGNORE_URI) {if (uri.contains(u)) {result = true;break;}}if (!result) {User user = (User) request.getSession().getAttribute("user");if (user == null) {request.setAttribute("message", "请先登录再访问该页面");request.getRequestDispatcher("/user/loginUI.do").forward(request, response);} else {result = true;}}return result;}/** * <p> * 1.afterCompletion和postHandle在preHandle方法返回值为true时才能执行;<br> *  2.也就是在Controller方法执行后、视图渲染之前调用,所以可以对Contoller处理后的ModelAndView对象进行操作;<br> *  3.postHandle方法的执行次序和preHandle相反,类似于Struts2中的拦截器。<br> * </p> * */@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mv)throws Exception {}/** * <p> * 1.afterCompletion和postHandle在preHandle方法返回值为true时才能执行;<br> *  2.该方法在整个请求结束之后,即视图渲染结束后执行;<br> *  3.该方法主要作用是进行资源的清理。<br> * </p> * */@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e)throws Exception {}}

4.拦截器配置

在springmvc.xml中通过<mvc:interceptors>配置拦截器,<mvc:interceptor>配置具体拦截器信息,拦截的url,调用的拦截器类,可以配置多个拦截器,注意次序即可。

<!-- 定义拦截器 --><!-- path属性/**:所有文件夹及其子文件夹 /* :所有文件夹,不含子文件夹/  :web项目的根目录 --><mvc:interceptors><mvc:interceptor><!-- <mvc:mapping path="/*"/> --><!-- <mvc:mapping path="/**"/> --><!-- 拦截所有 --><mvc:mapping path="/**/*.do"/><!-- 拦截指定后缀 --><!-- <mvc:exclude-mapping path=""/> --><!-- 不拦截的路径 --><bean class="cn.edu.njit.interceptor.RequestInterceptor"/></mvc:interceptor></mvc:interceptors>

5.测试

(1).未登录时访问其他页面


(2).用户或密码错误


6.注

(1).对于需要放行(不拦截)的url需要考虑清楚;

(2).拦截器的配置可以通过springmvc.xml中显示配置,也可通过注解实现。

(3).<mvc:mapping path=""/>中,path属性有多种写法,/*、/**、/*/**.do,根据实际情况配置。

(4).本例中UserController、login(...)上都有@RequestMapping("/xxx"),类似于有二级路径,所以通过'/*'则拦截不到请求。


0 0
原创粉丝点击