springmvc下的Token设计
来源:互联网 发布:没卡怎么在淘宝买东西 编辑:程序博客网 时间:2024/06/06 09:03
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/>
public void TokenAuthbefor(){
}
@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,其中一些借鉴他人的实现想法
- springmvc下的Token设计
- springmvc下的基于token的防重复提交
- springmvc下的基于token的防重复提交
- springmvc下的基于token的防重复提交
- springmvc下的基于token的防重复提交
- springmvc下的基于token的防重复提交
- springmvc下的基于token的防重复提交实现
- springmvc下的基于token的防重复提交
- springmvc下的基于token的防重复提交
- 防重复提交专题系列3-3:springmvc下的基于token的防重复提交
- app登录的token设计
- java下的token校验
- springmvc token资料收集
- API设计中token的思路
- app的token与登录超时设计
- 用户Cookie(token)的设计
- 听听Vitalik对token设计的看法
- 使用token和SpringMVC来实现安全的RESTFul接口
- CentOS7 yum安装mongodb
- 在Kali linux下安装XAMPP并搭建DVWA遇到的问题及解决办法
- itop4412 uboot 学习详细记录(二丶Exynos4412 uboot的组成)
- Codeforces Round #449 (Div. 2) D(思维)
- 【安全牛学习笔记】OWASP_ZAP
- springmvc下的Token设计
- 前端移动端适配方法
- 如何使用Rust提高Ruby性能
- IDA 使用技巧
- POST请求慎用301 Moved Permanently
- 2017主要服务产品体系
- jquery event.target 事件委托
- 使用USRP e300系列网络模式的一般流程
- hadoop 源码编译2.7.4