zoukankan      html  css  js  c++  java
  • [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>
    .................
  • 相关阅读:
    Python批量删除字符串中两个字符中间值
    2020年大三下学期第十周学习心得
    2020年大三下学期第九周学习心得
    2020.2.4
    2020.2.3
    2020.2.2
    2020.2.1
    签到六(开发)
    签到五(开发)
    签到四(开发)
  • 原文地址:https://www.cnblogs.com/ruhuaxiao/p/5336994.html
Copyright © 2011-2022 走看看