1.依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
2.自定义注解:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface LoginCheck {
boolean check() default false;
}
3.继承spring的HandlerInterceptor接口实现了里面的的方法:
在拦截器中需要加入注解的逻辑
public class LoginInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse response, Object handler) throws Exception {
System.out.println("进入拦截器");
//1.判断是否存在注解
if(!(handler instanceof HandlerMethod)){
return true;
}
HandlerMethod method = (HandlerMethod)handler;
boolean hasLoginAnnotation=method.getMethod().isAnnotationPresent(LoginCheck.class);
if(!hasLoginAnnotation){
//不存在LoginRequired注解,则直接通过
return true;
}
LoginCheck loginCheck=method.getMethod().getAnnotation(LoginCheck.class);
//2.required=false,则无需检查是否登录
if(!loginCheck.check()){
return true;
}
Object user = httpServletRequest.getSession().getAttribute("user");
if (user != null) {
return true;
}
//3.登录状态检查,使用response返回指定信息
//response.getWriter().append("you need login!");
response.sendRedirect("http://localhost:8081");
return false;
}
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
4.在springmvc的配置文件中配置拦截器:
<!--设置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.common.checked.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
5.在Controller的方法中加入自定义注解:
@LoginCheck(check = true)
@RequestMapping("buy")
public String buy(Integer id, Integer num) {
System.out.println("进入到buy方法");
System.out.println("id"+id+"num"+num);
return "index";
}
在方法上面加@LoginCheck(check = true)注解时拦截器会判断用户是否登录,登录则进入方法,否则重定向到登录页面。