赞
踩
1.第一次开发前后端分离项目,后台使用java SpringMvc,因为前端使用ajax,存在跨域问题,所以后台使用token的方式设计接口安全,直接上想法和代码。采用自定义的注解进行Token认证。直接上代码。
创建自定义注解 UserAccess,
代码:
/**
* 自定义注解 验证Token
* @author Administrator
*
*/
@Target({ElementType.METHOD,ElementType.TYPE}) //目标是方法
@Retention(RetentionPolicy.RUNTIME) //注解会在class中存在,运行时可通过反射获取
@Inherited
@Documented //文档生成时,该注解将被包含在javadoc中,可去掉
public @interface UserAccess {
String desc() default "身份和安全验证开始...";
}
2.使用spring的Aop编程
在spring.xml上开启
<!-- 开启Aop注解 -->
<aop:aspectj-autoproxy/>
@Around("TokenAuthbefor()")
public @ResponseBody
Object beforeAdevice(ProceedingJoinPoint joinPoint) throws Throwable{
System.out.println("before");
// 获取拦截的请求参数
Object[] args = joinPoint.getArgs();
HttpServletRequest request=(HttpServletRequest)args[0];
String token=request.getParameter("token");
System.out.println("前置通知 token:"+token);
// 对token做认证 可以考虑使用Redis 做为缓存
String a = redisTemplate.opsForValue().get(token);
System.out.println("a="+a);
String msg = "";
if(token!= null){
if(null == redisTemplate.opsForValue().get(token)){
msg ="1" ;
throw new AcessTokenException("110");
}else{
joinPoint.proceed();
msg = "2";
String username = redisTemplate.GET(token);
redisTemplate.opsForValue().set(token, username, 1, TimeUnit.MINUTES);
}
}else{
msg ="1" ;
throw new AcessTokenException("110");
}
return msg;
}
这里使用了自定义异常AcessTokenException自己设置code,其中redis存放token:username,缓存可以自己选择。
3.自定义异常
public class AccessTokenExceptionride implements HandlerExceptionResolver {
/**
* @param ex accesstoken系统抛出的异常
*/
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) {
//handler就是处理器适配器要执行Handler对象(只有method)
ModelAndView mv = new ModelAndView();
if(ex instanceof AcessTokenException) {
FastJsonJsonView view = new FastJsonJsonView();
Map<String, Object> attributes = new HashMap<String, Object>();
attributes.put("code", ex.getMessage());
// 110 表示token不存在或者失效
view.setAttributesMap(attributes);
mv.setView(view);
}
return mv;
}
}
继承
HandlerExceptionResolver,定义全局异常解析器AccessTokenExceptionride,至于为什么可以自己去搜一下其他的博客.
4.测试,添加自定义接口
@UserAccess
@RequestMapping("/newtest")
public void newtest(HttpServletRequest request){
String a= request.getParameter("username");
String b = request.getParameter("password");
String c= request.getParameter("jac");
System.out.println(c);
System.out.println(b);
System.out.println(a);
}
在1分钟后,token失效,访问这个接口,返回自定义异常的code.
5.至于token是生成,网上一大堆,不把该代码贴出来,在登录成功后给客户端一个token,然后将token放在url或者headershan,其中一些借鉴他人的实现想法
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。