1:springmvc 配置文件中添加拦截器,当然首先要有拦截后交给哪个类处理也要写上
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.kad.authorization.AuthorizationInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
以上 path=/**代表所有文件夹目录 .一般这么写就能拦截所有的请求了
<bean class="com.kad.authorization.AuthorizationInterceptor" /> 这个是处理所拦截的类
2:写@Authorization接口
就是下边几句.这个接口后来总结 就是告诉编译器这是个注解需要的接口, 访客访问到方法时,上边带上这个注解的, 在拦截处理方法中能拦截这些带注解的方法,并做相关处理
就像强制访客访问带了胸牌@Authorization 的方法,要做一次token验证的步骤,那些不戴@Authorization,又符合拦截规则的,就不做token验证,实际应用中,比如login register 等服务是不需要验证token的.当然项目需求不一样.所设置的规则不一样
package com.kad.authorization; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 在Controller的方法上使用此注解,该方法在映射时会检查用户是否登录,未登录返回401错误 * @see com.scienjus.authorization.interceptor.AuthorizationInterceptor * @author ScienJus * @date 2015/7/31. */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Authorization { }
3:在处理类中处理添加了@Authorization 注解的 request请求, 一般来说验证token 正确返回true 错误返回false 一般就是401的错误
public class AuthorizationInterceptor extends HandlerInterceptorAdapter { @Resource private TokenManager manager; public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //如果不是映射到方法直接通过 if (!(handler instanceof HandlerMethod)) { return true; } HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); //如果注明了@authorization,需要进行验证,进行验证返回401错误 if (method.getAnnotation(Authorization.class) != null) { //从header中得到token String authorization = request.getParameter("username");//.getHeader(Constants.AUTHORIZATION); //验证token TokenModel model = manager.getToken(authorization); // 访问的不是下的,直接跳过 String name = handlerMethod.getBeanType().getPackage().getName(); /* if (name.contains("com.kad.app.action.user")) { return true; } */ if (manager.checkToken(model)) { //如果token验证成功,将token对应的用户id存在request中,便于之后注入 request.setAttribute(Constants.CURRENT_USER_ID, model.getUserId()); return true; } else { response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); return false; } } return true; } }
测试
@Authorization @RequestMapping(value="/AuthTest") public void Test(String username,String password ) { Userinfo _uresinfo = null; String gsonString = null;
客户端请求先到拦截器处理方法处理一下, 如果是false 直接就返回了,如果正确才会跳到这个Test方法内