JavaWeb开发中判断App端是否已登录的方式
来源:互联网 发布:linux 重启后挂载失败 编辑:程序博客网 时间:2024/04/26 06:30
在token生成上考虑到单点登录,所以token不能一直固定,否则在任何时候,只要拥有token就可以同时至少两个人使用同一个帐户,这是目前我们业务上不允许的。最终我选择了”username+password+登录时间“做MD5加密作为token(在保证唯一和可变的情况下,有很多方法,比如uuid)。在验证用户名和密码成功的情况下生成token,并将token以“username:token” 和 “token:用户”的键值对形式保存起来(也可以保存进数据库),最后返回token给客户端。
以下代码只做一个简单示例:
@Service
public class LoginService {
/**
* 存放“用户名:token”键值对
*/
public static Map<String,String> tokenMap=new HashMap<String,String>();
/**
* 存放“token:User”键值对
*/
public static Map<String,User> loginUserMap=new HashMap<String,User>();
public String login(String name,String password){
System.out.println(name+"-----"+password);
/**
* 判断是否登录成功
* 1.登录成功
* 1.1.成功生成对应的token并更新
* 1.2.失败就抛异常
*/
String token=tokenMap.get(name);
User user=null;
if(token==null){
user=new User();
user.setName(name);
user.setPassword(password);
System.out.println("新用户登录");
}else{
user=loginUserMap.get(token);
loginUserMap.remove(token);
System.out.println("更新用户登录token");
}
token=MD5Util.MD5(name+password+new Date().getTime());
loginUserMap.put(token, user);
tokenMap.put(name, token);
System.out.println("目前有"+tokenMap.size()+"个用户");
for(User u:loginUserMap.values()){
System.out.println(u.getName()+":"+u.getPassword());
}
return token;
}
}
4.于此同时,我们的客户端登陆后也就获得了token,只要在所有需要权限的请求中携带token即可成功获取响应(建议:为方便app编码,token可携带在请求头中,现有代码就无需大改动,并且今后都不需要关心token的问题)。我随便找了个method做实验:
@Controller
@RequestMapping("/login")
public class LoginController {
@Autowired
private LoginService loginService;
@UserAccess
@RequestMapping(value="/loginin",method=RequestMethod.GET)
public @ResponseBody String login(HttpServletRequest request){
String name=request.getParameter("name");
String password=request.getParameter("password");
String token=loginService.login(name, password);
return token;
}
}
注意加粗部分就是自定义annotation,登陆功能的请求参数是不可能有token的,所以不管验证多少次,都不可能通过,只是做个示例。@UserAccess添加在需要权限验证的功能上才起作用
5.现在自定义annotation就是一个很好的切入点
@Component
@Aspect
public class PermissionAspect {
//设置以自定义annotation作为切入点
@Before("@annotation(com.example.chap01.annotation.UserAccess)")
public void checkPermission(JoinPoint joinPoint) throws Exception{
System.out.println("前置通知");
//获取拦截的请求参数
Object[] args = joinPoint.getArgs();
HttpServletRequest request=(HttpServletRequest)args[0];
String token=request.getParameter("token");
System.out.println("前置通知 token:"+token);
User user=LoginService.loginUserMap.get(token);
if(user==null){
System.out.println("验证不通过!");
throw new Exception("没有权限");
}
}
}
- JavaWeb开发中判断App端是否已登录的方式
- 判断app是否已启动
- Gerrit插件开发之判断用户是否已登录的方法
- javaweb查询所有登录的用户,判断是否在线
- 判断手机上是否已安装app
- 采用基类的方式判断用户是否登录(1)
- 采用基类的方式判断用户是否登录(2)
- 采用基类的方式判断用户是否登录(1)
- 采用基类的方式判断用户是否登录(2)
- js判断本地是否安装app,未安装去下载,已安装打开本地的app
- C#中判断socket是否已断开的方法
- C#中判断socket是否已断开的方法
- C#中判断socket是否已断开的方法
- C#中判断socket是否已断开的方法
- C#中判断socket是否已断开的方法
- android程序中 通过包名判断手机上是否已安装app
- .NET中进入后台时判断是否登录的方法
- VC中判断程序是否已运行
- 文章标题
- Intent的使用
- Base: 一种Acid的替代方案
- iOS-UITextField中给placeholder动态设置颜色
- Objective-C Autorelease Pool 的实现原理
- JavaWeb开发中判断App端是否已登录的方式
- JAVA温习课堂14
- SQL面试题目汇总
- android 调用webservice出错
- 机器学习算法之七:5分钟上手SVM
- sql 查询科目成绩以及平均成绩
- 深入理解Redis中的主键失效及其实现机制
- 【Android实战之旅 004】Android摄像头基础
- Leetcode 283 Move zeros