###定义拦截器
实现HandlerInterceptor方法。
###拦截器配置
springmvc 拦截器针对HandlerMapping进行拦截设置。如果HandlerMapping映射成功才进行拦截。
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="handlerInterceptor1"/>
<ref bean="handlerInterceptor2"/>
</list>
</property>
</bean>
<bean id="handlerInterceptor1" class="club.lemos.ssm.interceptor.HandlerInterceptor1"/>
<bean id="handlerInterceptor2" class="club.lemos.ssm.interceptor.HandlerInterceptor1"/>
springmvc 配置类型全局的拦截器,springmvc框架将配置的类似全局的拦截器注入到每个HandlerMapping中。
自定义拦截器
public class HandlerInterceptor1 implements HandlerInterceptor {
//进入Handler之前
//用于身份验证、身份授权
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("preHandle...interceptor1");
return true;
}
//在Handler之后,在DispatcherServlet进行渲染之前
//应用场景从ModelAndView出发,可以将公用模型数据传导视图(比如菜单导航)。也可以在这里统一指定视图。
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle...interceptor1");
}
//在渲染视图之后
//统一的异常处理。统一的日志处理。
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("afterCompletion...interceptor1");
}
}
###拦截器规律
- 只有第一个拦截器放行了,才有可能执行后面的拦截器。
- 第一个拦截器的 postHandler不一定执行,只有当所有拦截器都通过时,才会执行postHandler。
- 第一个拦截器的 afterCompletion一定执行。
例如:若要进行统一日志处理,需要将第一个Prehandler放行。
###拦截器的应用(实现登录认证)
一、需求:
- 用户请求url
- 如果url 是公开地址,放行。
- 如果用户session 不存在,跳转到登录界面。
- 如果用户session 存在,放行。
二、登录controller
LoginController .java
@Controller
public class LoginController {
//用户登录
@RequestMapping("/login")
public String login(Model model, HttpSession session, String username, String password, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//调用service 进行验证
//这里没有验证,因此点击登录会直接进入商品界面。
//...
session.setAttribute("username", username);
if (username == null || username.isEmpty()) { //当用户名为null或者为空时,让他登录。
return "login";
}
else if (!username.equals("张三")) {
model.addAttribute("msg", "用户名或者密码错误!");
return "login";
}
return "redirect:/items/queryItems";
}
//用户注销
@RequestMapping("/logout")
public String logout(HttpSession session) {
session.invalidate();
return "redirect:/items/queryItems";
}
}
三、登录拦截实现
loginInterceptor.java
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
//判断url是否是公开地址
String url = httpServletRequest.getRequestURI();
if (url.contains("login")) {
return true;
}
//判断session是否存在
HttpSession session = httpServletRequest.getSession();
String username = (String) session.getAttribute("username");
if (username != null && !username.isEmpty()) {
System.out.println("名字"+username+"。");
return true;
}
//拦截的处理:打到url为login的Handler,让它去处理
httpServletResponse.sendRedirect(httpServletRequest.getContextPath()+"/login");
return false; //反回false,表示拦截。
}
四、注意要配置拦截器映射
springmvc-servlet.xml
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="club.lemos.ssm.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
注意:不能重定向到WEB-INF下的网页。若要重定向到此网页,必须在controller中,且该controller有requestMapping 的url。
来源:oschina
链接:https://my.oschina.net/u/3053700/blog/791467