• [Java]利用拦截器和自定义注解做登录以及权限验证


    1.自定义注解

    需要验证登录的注解

    package com.etaofinance.wap.common;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Inherited;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    @Documented
    @Retention(RetentionPolicy.RUNTIME)//
    @Target({ElementType.METHOD, ElementType.TYPE})//该注解修饰类中的方法
    @Inherited
    public @interface RequireLogin{
     /**
      * 登录验证注解
      * 该注解可以标记Controller 或 Controller 中的方法.
      * 如果Controller 有该标记,那么这个Controller下面所有的方法都会被过滤器
      * 进行验证
      * 如果Controller 没有有该标记,但Controller中的某个方法拥有该标记
      * 那么这个方法将被过滤器验证(其他没有被标记的不会被验证)
      * 
      * 特别注意,如果一个Controller 被标记RequireLogin 需要验证
      * 但是其中某些方法不想被验证.请参见NoRequireLogin标记
      * 
      * 茹化肖 2016年3月30日10:51:13
      */
    }
    

      不需要验证登录的注解

    package com.etaofinance.wap.common;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Inherited;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    @Documented
    @Retention(RetentionPolicy.RUNTIME)//
    @Target(ElementType.METHOD)//该注解修饰类中的方法
    @Inherited
    public @interface NoRequireLogin{
     /**
      * 不需要登录验证的方法注解注解
      * 该注解在Controller 标记了 RequireLogin 特性时
      * 某个方法不需要验证登录,那么为该方法标记该注解
      * 茹化肖 2016年3月30日10:47:16
      */
    }

    拦截器实现

    package com.etaofinance.wap.common;
    
    import java.io.OutputStream;
    import java.lang.annotation.Annotation;
    import java.lang.reflect.Method;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.springframework.web.method.HandlerMethod;
    import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
    import com.etaofinance.core.util.JsonUtil;
    import com.etaofinance.core.util.PropertyUtils;
    import com.etaofinance.entity.common.HttpResultModel;
    /**
     * 权限拦截器
     * @author ofmyi_000
     *
     */
    public class AuthInteceptor extends HandlerInterceptorAdapter {
    
    	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    		String basePath =PropertyUtils.getProperty("java.wap.url");
    		if (handler instanceof HandlerMethod) {
    			HandlerMethod myHandlerMethod = (HandlerMethod) handler;
    	        Object bean = myHandlerMethod.getBean();
    	        Method method= myHandlerMethod.getMethod();
    	        Annotation classAnnotation = bean.getClass().getAnnotation(RequireLogin.class);//类上有该标记
    	        Annotation methodAnnotation=method.getAnnotation(RequireLogin.class);//方法上有该标记
    	        Annotation methodNologinAnnotation=method.getAnnotation(NoRequireLogin.class);//
    	        if((classAnnotation!=null&&methodNologinAnnotation==null)
    	        		||(classAnnotation==null&&methodAnnotation!=null))
    	        {
    	        	boolean isLogin = LoginUtil.checkIsLogin(request,response);
    	        	if(isLogin)
    	        		return true;
    	        	else{//未登录
    	        		if(isAjax(request)){
    	        			//Ajax请求返回JSON
    	        			HttpResultModel<Object> rep=new HttpResultModel<Object>();
    	        			rep.setCode(-1);
    	        			rep.setMsg("请登录后操作!");
    	        			String data = JsonUtil.obj2string(rep);
    	        	        response.setHeader("content-type", "text/html;charset=UTF-8");
    	        	        OutputStream out = response.getOutputStream();
    	        	        out.write(data.getBytes("UTF-8"));
    	        	        return false;
    	        		}
    	        		response.sendRedirect(basePath);
    	        		
    	        	}//IF LOGIN END
    	        }//if Annotation end
    		}
    		return true;
    	}
    	private boolean isAjax(HttpServletRequest request){
    		String requestType = request.getHeader("X-Requested-With");
    		if (requestType != null && requestType.equals("XMLHttpRequest")) {
    			return true;
    		}
    		return false;
    	}
    }
    

      

    XML拦截器配置

    ...............
    <mvc:interceptors>
            <bean class="com.etaofinance.wap.common.GlobalLogInteceptor">
                <property name="sourceSys" value="etaofinancewap"></property>
            </bean>
            <bean class="com.etaofinance.wap.common.AuthInteceptor" />
        </mvc:interceptors>
    .................
  • 相关阅读:
    HTML_项目符号使用图片
    字符串查找和替换接口
    AOP代理分析
    3星|董藩《房地产的逻辑》:应该鼓励开发商多盖房而不是惩罚开发商
    2.5星|郎咸平《拯救世界的经济学》:各发达国家与中国的福利政策、经济干预政策的前世今生
    3.5星|科特勒《营销革命4.0》:打造无缝衔接的线上和线下体验
    3星|《韩国式资本主义》:财阀祸害韩国,韩国需要正义的资本主义
    4星|《特朗普时代的全球化战略》:管理学界和管理者可能严重低估了核心管理实践的价值
    2星|《内容创业》:知识付费行业的公开资料整理汇编
    3星|《身边的博弈》:10年旧书,博弈论科普和习题讲解
  • 原文地址:https://www.cnblogs.com/ruhuaxiao/p/5336994.html
Copyright © 2020-2023  润新知