站长工具怎么用,软文营销网,网站响应是什么,景观设计师如何做网站JwtFilter
第五步#xff1a;定义jwt的过滤器JwtFilter。
这个过滤器是我们的重点#xff0c;这里我们继承的是Shiro内置的AuthenticatingFilter#xff0c;一个可以内置了可以自动登录方法的的过滤器#xff0c;有些同学继承BasicHttpAuthenticationFilter也是可以的。 …JwtFilter
第五步定义jwt的过滤器JwtFilter。
这个过滤器是我们的重点这里我们继承的是Shiro内置的AuthenticatingFilter一个可以内置了可以自动登录方法的的过滤器有些同学继承BasicHttpAuthenticationFilter也是可以的。
我们需要重写几个方法 createToken实现登录我们需要生成我们自定义支持的JwtToken onAccessDenied拦截校验当头部没有Authorization时候我们直接通过不需要自动登录当带有的时候首先我们校验jwt的有效性没问题我们就直接执行executeLogin方法实现自动登录 onLoginFailure登录异常时候进入的方法我们直接把异常信息封装然后抛出 preHandle拦截器的前置拦截因为我们是前后端分析项目项目中除了需要跨域全局配置之外我们再拦截器中也需要提供跨域支持。这样拦截器才不会在进入Controller之前就被限制了。
跨域
下面我们看看总体的代码
com.markerhub.shiro.JwtFilter
Component
public class JwtFilter extends AuthenticatingFilter {AutowiredJwtUtils jwtUtils;Overrideprotected AuthenticationToken createToken(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {// 获取 tokenHttpServletRequest request (HttpServletRequest) servletRequest;String jwt request.getHeader(Authorization);if(StringUtils.isEmpty(jwt)){return null;}return new JwtToken(jwt);}Overrideprotected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {HttpServletRequest request (HttpServletRequest) servletRequest;String token request.getHeader(Authorization);if(StringUtils.isEmpty(token)) {return true;} else {// 判断是否已过期Claims claim jwtUtils.getClaimByToken(token);if(claim null || jwtUtils.isTokenExpired(claim.getExpiration())) {throw new ExpiredCredentialsException(token已失效请重新登录);}}// 执行自动登录return executeLogin(servletRequest, servletResponse);}Overrideprotected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e, ServletRequest request, ServletResponse response) {HttpServletResponse httpResponse (HttpServletResponse) response;try {//处理登录失败的异常Throwable throwable e.getCause() null ? e : e.getCause();Result r Result.fail(throwable.getMessage());String json JSONUtil.toJsonStr(r);httpResponse.getWriter().print(json);} catch (IOException e1) {}return false;}/*** 对跨域提供支持*/Overrideprotected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {HttpServletRequest httpServletRequest WebUtils.toHttp(request);HttpServletResponse httpServletResponse WebUtils.toHttp(response);httpServletResponse.setHeader(Access-control-Allow-Origin, httpServletRequest.getHeader(Origin));httpServletResponse.setHeader(Access-Control-Allow-Methods, GET,POST,OPTIONS,PUT,DELETE);httpServletResponse.setHeader(Access-Control-Allow-Headers, httpServletRequest.getHeader(Access-Control-Request-Headers));// 跨域时会首先发送一个OPTIONS请求这里我们给OPTIONS请求直接返回正常状态if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())) {httpServletResponse.setStatus(org.springframework.http.HttpStatus.OK.value());return false;}return super.preHandle(request, response);}
}