自定义注解 登录拦截

来源:互联网 发布:mysql 合计函数 编辑:程序博客网 时间:2024/06/10 14:24

1.自定义登录验证注解类

package com.*.*;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * 自定义登录验证注解 */@Target({ ElementType.METHOD, ElementType.TYPE })//METHOD:用于描述方法,TYPE:用于描述类、接口(包括注解类型)或enum声明@Retention(RetentionPolicy.RUNTIME)//在运行时有效(即运行时保留)public @interface RequireLogin {    /**     * 是否要登录     * @return     */    boolean value() default true;}

2.在方法、类、接口或者枚举上声明

例如:在某方法上添加@RequireLogin

    @RequireLogin//默认为true    @RequestMapping(value = "/list", method = RequestMethod.POST)    public void list(String code, HttpServletResponse response, HttpServletRequest request){        //内容省略。。。    }

3.如何实现注解判断是否登录?对相应注解信息处理(其他注解功能根据需求编写逻辑)

    <-- 拦截器配置 -->    <mvc:interceptors>        <mvc:interceptor>            <mvc:mapping path="/**" />            <bean class="com.*.*.interceptor.LoggerInterceptor"></bean>        </mvc:interceptor>    </mvc:interceptors>

拦截器

package com.*.*.interceptor.LoggerInterceptor;import java.lang.reflect.Method;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.lang3.StringUtils;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.springframework.web.method.HandlerMethod;import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import com.*.*.controller.BaseController;import com.*.*.annotation.RequireLogin;import com.*.*.utils.LoginUtils;/** * 登录拦截器 */public class LoginInterceptor extends HandlerInterceptorAdapter {    protected static final Log logger = LogFactory.getLog(LoginInterceptor.class);    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {    HandlerMethod handlerMethod = (HandlerMethod) handler;    Method method = handlerMethod.getMethod();    RequireLogin requireLogin = method.getAnnotation(RequireLogin.class);    if (requireLogin == null) {        Class<?> cls = handlerMethod.getBeanType();        requireLogin = cls.getAnnotation(RequireLogin.class);    }    if (requireLogin != null && requireLogin.value()) {        // 获得cookie中的customerId(用户登录Id)        String customerId = LoginUtils.getMemberId(request);        if (StringUtils.isBlank(customerId)) {        Object action = handlerMethod.getBean();        if (action instanceof BaseController) {//BaseController为controller的父类            ((BaseController) action).putLoginFailedResult(response, "您还没有登录,或者登录已超时,请重新登录!");        }        LoginUtils.removeLoginCookie(response);//移除cookie        return false;        }        return true;    }    return true;    }}