龙空技术网

JWT用户登录认证方案

九天银河888 110

前言:

如今我们对“当前登录失效请重新登录怎么回事”大体比较讲究,咱们都需要剖析一些“当前登录失效请重新登录怎么回事”的相关内容。那么小编在网络上网罗了一些有关“当前登录失效请重新登录怎么回事””的相关内容,希望你们能喜欢,咱们一起来了解一下吧!

JWT 介绍

JWT是JSON Web Token 的缩写,是为了在网络应用环境间传递声明而执行的一种基于JSON 的开放标准((RFC 7519)。定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的,JWT 可以使用 HMAC 算法或者是 RSA 的公私秘钥对进行签名。

JWT流程

步骤说明:

用户使用账号和密码向服务端发起请求。服务器使用私钥根据JWT的规则生成一个token。服务器返回这个token给浏览器。浏览器将该token放在请求头中向服务器发送请求。服务器根据JWT规则验证该 token。服务器返回信息给浏览器。

JWT 数据结构

JWT由三部分构成,分别为头部(Header),负载(Payload)和签名(Signature)。头部包括签名算法、token类型,负载用来存放实际需要传递的有效信息。签名部分是对前两部分的签名,防止数据篡改。服务器端会指定一个密钥,这个密钥对客户端保密。使用 Header 里面指定的签名算法(默认是 HMAC SHA256)对头部和负载进行签名,然后把签名返回给客户端。对于客户端来讲,就是一段字符串,这里就不再过多讲解。

SpringBoot整合JWT

1.pom文件中引用依赖

        <dependency>            <groupId>com.auth0</groupId>            <artifactId>java-jwt</artifactId>            <version>3.8.2</version>        </dependency>

2.用到的用户信息实体类

public class User {    private String username;    private String password;    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }}

3.token的生成和认证

public class JwtUtil {    private static final String SECRET = "0123456789";    private static final long EXPIRATION = 1800L;    /**     * 生成token     */    public static String createToken(User user) {        Date expireDate = new Date(System.currentTimeMillis() + EXPIRATION * 1000);        Map<String, Object> map = new HashMap<>();        map.put("alg", "HS256");        map.put("typ", "JWT");        String token = JWT.create()                .withHeader(map)// 添加头部                //可以将基本信息放到claims中,                .withClaim("userName", user.getUsername())                .withClaim("password", user.getPassword())                .withExpiresAt(expireDate) //过期时间                .withIssuedAt(new Date()) //签发时间                .sign(Algorithm.HMAC256(SECRET)); //加密        return token;    }    /**     * 解析token     */    public static Map<String, Claim> verifyToken(String token) {        DecodedJWT jwt = null;        try {            JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET)).build();            jwt = verifier.verify(token);        } catch (Exception e) {            return null;        }        return jwt.getClaims();    }}

4.JWT过滤器,用于对token的统一验证

/* *在启动类上一定要加 @ServletComponentScan 注解,否则 urlPatterns 会不启作用 * urlPatterns配置要以“/”开始 */@WebFilter(filterName = "JwtFilter", urlPatterns = "/work/*")public class JwtFilter implements Filter {    @Override    public void init(FilterConfig filterConfig) throws ServletException {    }    @Override    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {        final HttpServletRequest request = (HttpServletRequest) req;        final HttpServletResponse response = (HttpServletResponse) res;        response.setCharacterEncoding("UTF-8");        final String token = request.getHeader("authorization");        if (token == null) {            response.getWriter().write("没有token!");            return;        }        Map<String, Claim> userData = JwtUtil.verifyToken(token);        if (userData == null) {            response.getWriter().write("token失效,请重新登陆!");            return;        }        String userName = userData.get("userName").asString();        String password = userData.get("password").asString();        request.setAttribute("userName", userName);        request.setAttribute("password", password);        chain.doFilter(req, res);    }    @Override    public void destroy() {    }}

5.Controller代码,

@RestControllerpublic class JwtController {    @RequestMapping("/login")    public String login(User user) {        String token = JwtUtil.createToken(user);        return token;    }    @RequestMapping("/work/getUser")    public String login(HttpServletRequest request) {        String userName = request.getAttribute("userName").toString();        String password = request.getAttribute("password").toString();        return "当前用户信息:userName=" + userName + ",password=" + password;    }}

6.执行login

返回登陆用户的token

7.执行/work/getUser。要把登陆后返回的token放到Header的Authorization参数中。

Token与Session比较token支持跨域,Session因需要cookie支持所以不能跨域token无状态,session有状态的token更适用于移动应用,Cookie不支持手机端访问的token能够预防CSRF攻击token对单点登陆友好token不能在服务端注销,不好解决劫持问题token比session更占用带宽

标签: #当前登录失效请重新登录怎么回事 #过滤器验证用户登录怎么弄 #token放到header #token放入header