Spring MVC拦截器
Spring MVC的interceptor拦截器拦截请求是通过实现HandlerInterceptor接口来完成的。
接来下举一个实例:
通过拦截器完成一个用户权限验证的功能—用户必须登录以后才能访问网站其他页面,如果没有登录就访问,则会被拦截器拦截,请求转发到登录页面并进行提示。
1.创建一个项目,导入相应的jar包,在web.xml中配置前端控制器。
2.编写一个实体类
private String username; private String password;
3.编写一个controller
@Controller public class UserController { @RequestMapping(value="/{pagename}") public String pageName(@PathVariable String pagename){ return pagename; } @RequestMapping("login") public ModelAndView login(String username,String password ,ModelAndView mv,HttpSession session){ if(username!=null&&username.equals("aaa")&&password!=null&&password.equals("111")){ User user = new User(); user.setUsername(username); user.setPassword(password); session.setAttribute("user", user); mv.setViewName("success"); }else{ mv.addObject("message", "账号或密码错误"); mv.setViewName("loginPage"); } return mv; } @RequestMapping("success") public String success(){ return "success"; } }
4.编写一个拦截器
public class UserInterceptor implements HandlerInterceptor{ /** * 该方法在整个请求完成后执行,主要用来清理资源 * 该方法只能在当前interceptor的preHandler方法的返回值是true时才会执行 */ @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { } /** * 该方法在Controller的方法调用后执行,在视图被渲染以前被调用,所以可以用来对ModelAndView对象进行操作 * 该方法只能在当前interceptor的preHandler方法的返回值是true时才会执行 */ @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { } /** * 该方法在请求之前被调用 * 该方法返回为true时拦截器才会继续往下执行 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //用于判断用户是否登录 boolean flag = false; User user = (User) request.getSession().getAttribute("user"); if(user==null){ request.setAttribute("message", "请先登录"); request.getRequestDispatcher("loginPage.jsp").forward(request, response); }else{ flag = true; } return flag; } }
5.配置springmvc-config.xml,在里面配置拦截器,配置拦截路径和不进行拦截的路径。
<!-- spring可以自动去扫描base-package下面的包或者子包下面的java类 如果扫描到有spring相关注解的类,则吧这个类注册为spring的bean --> <context:component-scan base-package="com.dj.controller"/> <!-- 配置拦截器 --> <mvc:interceptors> <mvc:interceptor> <!-- 拦截路径 --> <mvc:mapping path="/*"/> <!-- 不拦截的路径 --> <mvc:exclude-mapping path="/login"/> <mvc:exclude-mapping path="/loginPage"/> <bean class="com.dj.interceptor.UserInterceptor"></bean> </mvc:interceptor> </mvc:interceptors> <!-- 视图解析器 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 前缀 --> <property name="prefix"> <value>/</value> </property> <!-- 后缀 --> <property name="suffix"> <value>.jsp</value> </property> </bean>
6.编写登录页面和显示登录成功的页面,显示登录成功的页面只有在登录后才能访问,如果没有登录就访问将会被拦截。
<form action="login" method="post"> <!-- 提示信息 --> <font color="red">${requestScope.message }</font><br> 用户名:<input type="text" name="username" /><br> 密码:<input type="password" name="password"/> <input type="submit" value="登录"/> </form>
<body> 登陆成功! </body>
7.测试
直接访问success页面被拦截
访问登录页面,因为配置了不进行拦截的路径,所以显示如下
输入账号密码登录成功
源码下载路径 https://files.cnblogs.com/files/dj-blog/Interceptor.zip