自定义注解,实现拦截器

资讯网站项目
     存在登录和未登录两种状态的操作,调用后台方法需要进行判定是否登录。 此时拦截器派上用场

//拦截器用处(来源:跟着开涛学SpringMVC)
1、日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。
2、权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面;
3、性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录);
4、通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现。
5、OpenSessionInView:如Hibernate,在进入处理器打开Session,在完成后关闭Session。
…………本质也是AOP(面向切面编程),也就是说符合横切关注点的所有功能都可以放入拦截器实现。

HandlerInterceptorAdapter

public boolean preHandle(HttpServletRequest request, 
    HttpServletResponse response, Object handler) throws Exception { 

        return true;    
    }    
public void postHandle(HttpServletRequest request, HttpServletResponse response, 
    Object handler, ModelAndView modelAndView)    throws Exception {   

    }    
public void afterCompletion(HttpServletRequest request, HttpServletResponse 
    response, Object handler, Exception ex) throws Exception {    

    } 

分别实现预处理、后处理(调用了Service并返回ModelAndView,但未进行页面渲染)、返回处理(已经渲染了页面)
在preHandle中,可以进行编码、安全控制等处理;
在postHandle中,有机会修改ModelAndView;
在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。

//自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface NeedLogin {
    String value() default "";
}

//拦截器,继承HandlerInterceptorAdapter接口
public class LoginInterceptor extends HandlerInterceptorAdapter{
    public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {
        if(handler.getClass().isAssignableFrom(HandlerMethod.class)){//如果是spring mvc 方法
            NeedLogin needLogin = ((HandlerMethod)handler).getMethodAnnotation(NeedLogin.class);
            if(needLogin!=null){
                NewsUser u = (NewsUser) request.getSession().getAttribute("user");
                if(u==null){
                    String rt = request.getHeader("X-Requested-With");
                    if(rt!=null && "XMLHttpRequest".equals(rt)){
                        JSONObject json = new JSONObject();
                        json.put("isLogin", false);
                        response.getWriter().print(json.toString());
                        return false;
                    }else{
                        response.sendRedirect(request.getContextPath()+"/news/index");
                        return false;
                    }
                }else{
                    return true;
                }
            }
        }
        return true;
    }
}

根据以上写法:
    1.如果写了@NeedLogin注解,则调用方法之前会进行是否登录校验
    2.未写,则不校验

@NeedLogin
@ResponseBody
@RequestMapping(value="addOrUpdate")
public String addHistory(Long roomId, Long userId) {
    JSONObject obj = new JSONObject();
    boolean flag = false;
    ZhiboWatchRecord zhiboWatchRecord = zhiboWatchRecordService
        .addOrUpdateToHistory(roomId, userId);

    if (zhiboWatchRecord != null) {
        flag = true;
    }

    obj.put("status", flag? 1:0);

    return obj.toString();
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的示例,演示了如何使用自定义注解拦截器实现拦截功能: 首先,定义一个自定义注解`NoNeedToken`,用于标记不需要进行拦截的方法或类: ```java import java.lang.annotation.*; @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface NoNeedToken { } ``` 然后,创建一个拦截器`TokenInterceptor`,实现`HandlerInterceptor`接口,并在`preHandle`方法中进行拦截逻辑的处理: ```java import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class TokenInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (handler instanceof HandlerMethod) { HandlerMethod handlerMethod = (HandlerMethod) handler; // 判断方法上是否有NoNeedToken注解 if (handlerMethod.getMethodAnnotation(NoNeedToken.class) != null) { return true; // 不需要拦截,直接放行 } // 判断类上是否有NoNeedToken注解 if (handlerMethod.getBeanType().isAnnotationPresent(NoNeedToken.class)) { return true; // 不需要拦截,直接放行 } } // 需要拦截的逻辑处理 // ... return true; // 放行 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 拦截后的处理 // ... } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 请求完成后的处理 // ... } } ``` 最后,在Spring Boot的配置类中,将拦截器添加到拦截器链中: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { private final TokenInterceptor tokenInterceptor; @Autowired public WebConfig(TokenInterceptor tokenInterceptor) { this.tokenInterceptor = tokenInterceptor; } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(tokenInterceptor); } } ``` 这样,当请求进入拦截器时,会根据方法或类上的`NoNeedToken`注解判断是否需要进行拦截

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值