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> .................
