springMVC 的Interceptor拦截器的主要作用是拦截用户的请求并进行相应的处理。比如通过它进行权限验证,或者判断用户是否登录等操作。对于springMVC 拦截器的定义方式有两种。(双击shift可以找东西)
1.实现org.springframework.web.servlet.HandlerInterceptor这个接口,这个接口中有这几个方法。
拦截器写完了,怎么使得拦截器生效呢?
生效拦截器需要xml文件配置:
两种配置方式,推荐使用第二种:
<!-- 生效拦截器的第一种配置-->
<!-- 这里拦截了所有的Handler-->
<mvc:interceptors>
<bean class="com.zks.springmvc.interceptors.MyInterceptor1"></bean>
</mvc:interceptors>
<!--
拦截器生效的第二总方式
mvc:mapping:配置拦截器拦截资源:支持通配符 可以配置多个
mvc:exclude-mapping:配置拦截器放行资源,可以多个
-->
<mvc:interceptors>
<mvc:interceptor>
<!-- /**是拦截全部资源-->
<mvc:mapping path="/**"/>
<!-- 这里是放行/hello.do-->
<mvc:exclude-mapping path="/hello.do"/>
<bean class="com.zks.springmvc.interceptors.MyInterceptor1"></bean>
</mvc:interceptor>
</mvc:interceptors>
这是实现拦截器的第一种方法,实现HandlerInterceptor接口
public class MyInterceptor1 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("目标方法执行前执行----preHandle方法");
/**
* true:执行handler方法
* false:阻止目标Handler方法执行
*/
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("目标方法执行后,视图生成前执行postHandle方法");
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("目标方法执行后,视图生成后执行afterCompletion方法");
}
}
第二种方式是:继承HandlerInterceptorAdapter这个父类。
//用这种方式的好处是不需要像实现接口那样要实现其中所有的方法。
public class MyIntercepero2 extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor2--->preHandle方法");
return true;
}
}
配置文件和实现接口的那个方式一样。推荐使用第二种配置文件的方式。
另外可以在配置文件中同时设置多个拦截器。注意事项:
1.先配置的拦截器的preHandler方法先执行。
2.先配置的拦截器的 postHander、 Completion方法后执行。
3.第一个拦截器拦截的方法,在第二个拦截器中不能放行,只能是第一个拦截器去放行。
<mvc:interceptors>
<mvc:interceptor>
<!-- /**是拦截全部资源-->
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/hello.do"/>
<bean class="com.zks.springmvc.interceptors.MyInterceptor1"></bean>
</mvc:interceptor>
<mvc:interceptor>
<!-- /**是拦截全部资源-->
<mvc:mapping path="/**"/>
<!-- 这里是放行/hello.do-->
<mvc:exclude-mapping path="/m02.do"/>
<bean class="com.zks.springmvc.interceptors.MyIntercepero2"></bean>
</mvc:interceptor>
</mvc:interceptors>
springMVC 拦截器测试:
@Controller
public class UserController {
@RequestMapping("user/login")
public ModelAndView userLogin(HttpSession httpSession){
ModelAndView mv=new ModelAndView();
System.out.println("用户登录");
mv.setViewName("success");
User user=new User();
user.setId(10);
user.setUserName("张三");
user.setUserPwd("123456");
//向session域对象中设置user对象
httpSession.setAttribute("userInfo",user);
return mv;
}
@RequestMapping("user/addUser")
public ModelAndView addUser(){
System.out.println("添加用户模块");
ModelAndView mv=new ModelAndView();
mv.setViewName("success");
return mv;
}
@RequestMapping("user/deleteUser")
public ModelAndView deleteUser(){
System.out.println("删除用户模块");
ModelAndView mv=new ModelAndView();
mv.setViewName("success");
return mv;
}
}
拦截器:
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
/**
* 获取用户session 信息
* 如果session信息存在,请求合法 放行
* 如果用户的session信息不存在,请求非法 阻止目标方法执行
*/
User user= (User) request.getSession().getAttribute("userInfo");
if(user==null){
//用户没有登录 或者 session已经失效
//getContextPath(),表示获取站点名
response.sendRedirect(request.getContextPath()+"/login.jsp");
return false;
}
return true;
}
配置的xml文件
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.zks.springmvc.controller">
</context:component-scan>
<mvc:annotation-driven>
<mvc:message-converters>
<bean
class="org.springframework.http.converter.StringHttpMessageConverter" />
<bean
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
</mvc:message-converters>
</mvc:annotation-driven>
<!--配置视图解析器 默认的视图解析器- -->
<bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="contentType" value="text/html" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/user/login.do"/>
<bean class="com.zks.springmvc.interceptors.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
</beans>