有的网页允许游客访问,但是当游客要去 回复一些评论,评论一些文章的时候,会将请求拦截下来并进行判断,判断是否登录。
1.先编写拦截器
1.先编辑拦截器
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("postHandle");
}
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("afterCompletion");
}
}
2 在springmvc.xml中配置拦截器
3.2.1 拦截全部控制器
<!-- 拦截器 -->
<mvc:interceptors>
<bean class="com.bjsxt.interceptor.MyInterceptor"></bean>
</mvc:interceptors>
3.2.2 拦截某几个控制器
3.2.2.1 <mvc:mapping/> path表示url被HandlerMapping解析后结果
<!-- 拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/demo"/>
<mvc:mapping path="/demo1"/>
<mvc:mapping path="/demo2"/>
<bean class="com.bjsxt.interceptor.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
2. preHandler()
4.1 返回值是否放行.true放行,false阻止.如果阻止还可以利用 重定向或请求转发到其他页面
4.2 第三个参数:
4.2.1 实际类型HandlerMethod
4.2.2 获取到拦截器的方法所有信息
boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object arg2)
HandlerMethod hm = (HandlerMethod)arg2;
Method method = hm.getMethod();
System.out.println(method.getName());获取方法名
if(method.getName().equals("demo")){
System.out.println("拦截的是demo");
}else{
System.out.println("不是demo");
}
5.1 第三个参数:HandlerMethod
5.2 第四个参数:ModelAndView
5.2.1 取到跳转到哪个视图
5.2.2 对作用域内值修改
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3){
// 1.获得视图名称
System.out.println("视图名称:"+arg3.getViewName()); //视图名称:index
// 2.获得作用域
Map<String,Object> map = arg3.getModel();
// 3.重新设置作用域
map.put("msg", map.get("msg").toString().replace("中国", "**"));
}
4. afterCompletion( )
6.1 无论是否出现异常都执行.
6.1.2 出现异常会跳过postHandle()方法,和jsp的解析class文件的过程
6.2 第三个参数:HandlerMethod
6.3 第四个参数:Exception,如果控制器中出现异常,参数不为null
6.4 此方法常用在日志记录功能
if(arg3!=null){
Logger logger = Logger.getLogger(MyInterceptor.class);
logger.error(arg3.getMessage());// 获得异常信息
}
7. 添加控制器后执行顺序