目的:通过注解标注该请求需要进行拦截
1.自定义注解:
创建名为LoginInterceptor的注解
//生成javadoc时会包含注解
@Documented
//作用域
@Target(
{ ElementType.METHOD, ElementType.TYPE })
//生命周期
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginInterceptor {
public String url() default "";
//可以随便写参数,在使用时调用
}
关于作用域:METHOD就是方法,TYPE表示类,申明该注解即可用在方法上,也可以用在类上。
至于注解里的变量:就是注解附带的信息,可以没有变量,如果有变量并且没有默认值(default)的时候,使用注解就必须赋值。
2.实现SpringMVC的拦截效果:
创建拦截器的类继承HandlerInterceptorAdapter(此时我们只想做前置拦截,就不实现HandlerInterceptor接口了,用适配器就好了)
public class LoginCheckController extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
boolean flag = false;
//通过handler请求的方法再获取被请求的方法上的LoginInterceptor注解
LoginInterceptor loginInterceptor = ((HandlerMethod)handler).getMethodAnnotation(LoginInterceptor.class);
//判断是否有LoginInterceptor注解
if(null == loginInterceptor){//没有注解表明该请求不需要被拦截直接返回true
flag = true;
}else {//有注解说明我们需要进行登录验证的处理
HttpSession session = request.getSession();
User user = (User)session.getAttribute("OFMUser");
if (null != user){//如果有session说明用户已经登陆返回值设置为true
flag = true;
}
}
if (flag == false){//说明用户此时没有登录,跳转到登录页面
loginInterceptor.url();//此处表示我们可以获取的到我们使用直接时传递的参数(只是为了证明我们可以获取使用注解时传递的参数,在当前程序里没有实际作用)
response.sendRedirect(request.getContextPath()+"/page/login");
}
return flag;
}
}
在SpringMVC的配置文件中添加
<!--拦截器-->
<mvc:interceptors>
<!-- 多个拦截器,顺序执行 -->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<!--被排除拦截的资源-->
<mvc:exclude-mapping path="/css/**"/>
<mvc:exclude-mapping path="/fonts/**"/>
<mvc:exclude-mapping path="/images/**"/>
<mvc:exclude-mapping path="/img/**"/>
<mvc:exclude-mapping path="/js/**"/>
<mvc:exclude-mapping path="/sass/**"/>
<bean class="com.sakura.controller.LoginCheckController"></bean>
</mvc:interceptor>
</mvc:interceptors>
在后面用<bean>申明我们创建的拦截器的类
最后在我们需要被拦截的请求上添加注解:
@LoginInterceptor(url = "login")
@RequestMapping("/text")
public ModelAndView toText(){
ModelAndView mv = new ModelAndView();
mv.setViewName("text");
return mv;
}
此处的url=“login”,就相当于给注解的url赋值 可以在拦截器中通过 注解对象.变量名获取。上面的代码有写出
自此我们就可以再需要被拦截的请求加上注解就可以实现拦截效果了。