当前位置: 首页 > news >正文

个人博客网站建设预算百度网站验证

个人博客网站建设预算,百度网站验证,如何搭建网站的支付接口,做网站开发的公司处理解析JWT时的异常 由于解析JWT是在过滤器中执行的#xff0c;而过滤器是整个服务器端中最早接收到所有请求的组件#xff0c;此时#xff0c;控制器等其它组件尚未运行#xff0c;则不可以使用此前的“全局异常处理器”来处理解析JWT时的异常#xff08;全局异常处理器…处理解析JWT时的异常 由于解析JWT是在过滤器中执行的而过滤器是整个服务器端中最早接收到所有请求的组件此时控制器等其它组件尚未运行则不可以使用此前的“全局异常处理器”来处理解析JWT时的异常全局异常处理器只能处理控制器抛出的异常也就是说在过滤器中只能使用try...catch语法来处理异常 为了便于表示需要响应到客户端的结果仍推荐使用JsonResult封装相关信息而响应到客户端的结果应该是JSON格式的则需要将JsonResult对象转换成JSON格式的字符串 在项目中添加fastjson依赖项此依赖项可以实现Java对象与JSON格式的字符串的相互转换 !-- fastjson实现对象与JSON的相互转换 -- dependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion1.2.75/version /dependency在处理异常之前还应该在ServiceCode中补充相关的业务状态码例如 ERR_JWT_EXPIRED(60000), ERR_JWT_MALFORMED(60100), ERR_JWT_SIGNATURE(60200),然后调整JwtAuthorizationFilter中解析JWT的代码片段 Claims claims null; response.setContentType(application/json; charsetutf-8); try {claims Jwts.parser().setSigningKey(secretKey).parseClaimsJws(jwt).getBody(); } catch (SignatureException e) {String message 非法访问;log.warn(解析JWT时出现SignatureException响应消息{}, message);JsonResultVoid jsonResult JsonResult.fail(ServiceCode.ERR_JWT_SIGNATURE, message);PrintWriter printWriter response.getWriter();printWriter.println(JSON.toJSONString(jsonResult));printWriter.close();return; } catch (MalformedJwtException e) {String message 非法访问;log.warn(解析JWT时出现MalformedJwtException响应消息{}, message);JsonResultVoid jsonResult JsonResult.fail(ServiceCode.ERR_JWT_MALFORMED, message);PrintWriter printWriter response.getWriter();printWriter.println(JSON.toJSONString(jsonResult));printWriter.close();return; } catch (ExpiredJwtException e) {String message 您的登录信息已过期请重新登录;log.warn(解析JWT时出现ExpiredJwtException响应消息{}, message);JsonResultVoid jsonResult JsonResult.fail(ServiceCode.ERR_JWT_EXPIRED, message);PrintWriter printWriter response.getWriter();printWriter.println(JSON.toJSONString(jsonResult));printWriter.close();return; }关于认证信息中的“当事人” 认证信息中的“当事人”可以通过AuthenticationPrincipal注入到方法控制器的方法的参数中在访求处理过程中可能需要获取“当事人”的ID、用户名等数据所以应该自定义数据类型表示“当事人”Spring Security也希望你这样做所以在认证结果的信息中的“当事人”被声明为Object类型 在项目的根包下创建security.LoginPrincipal类 package cn.tedu.csmall.passport.security;import lombok.Data;import java.io.Serializable;/*** 当事人类型就是成功通过认证的用户信息类型* * author javatedu.cn* version 0.0.1*/ Data public class LoginPrincipal implements Serializable {/*** 当事人ID*/private Long id;/*** 当事人用户名*/private String username;}然后调整JwtAuthorizationFilter中的相关代码 Long id claims.get(id, Long.class); String username claims.get(username, String.class); log.debug(从JWT中解析得到的管理员ID{}, id); log.debug(从JWT中解析得到的管理员用户名{}, username);// 基于解析JWT的结果创建认证信息 LoginPrincipal principal new LoginPrincipal(); principal.setId(id); principal.setUsername(username);// 暂不关心其它代码在控制器中处理请求的方法的参数列表中可以通过AuthenticationPrincipal注入LoginPrincipal类型的参数在处理请求的过程中可以通过此参数获取当事人的具体数据 GetMapping() public JsonResultListAdminListItemVO list(// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 自定义的当事人类型ApiIgnore AuthenticationPrincipal LoginPrincipal loginPrincipal) {log.debug(开始处理【查询管理员列表】的请求参数无);log.debug(当事人{}, loginPrincipal);log.debug(当事人的ID{}, loginPrincipal.getId());log.debug(当事人的用户名{}, loginPrincipal.getUsername());ListAdminListItemVO list adminService.list();return JsonResult.ok(list); }关于权限 目前当管理员登录成功后服务器端生成的JWT中并不包含此管理员的权限信息所以此管理员后续携带JWT提交请求时服务器端也无法根据此JWT直接获取管理员的权限列表更加不能把正确的权限列表存入到SecurityContext中的认证信息中所以无法检查管理员的权限 可以在管理员登录成功后将此管理员的权限列表也写入到JWT中 **注意**由于权限列表并不是一般的字面值数据生成到JWT中后将无法还原回原本的集合类型应该先将权限列表转换成JSON格式的字符串后续再根据此JSON数据还原回原本的列表 在AdminServiceImpl中的login()方法中调整 // 将通过认证的管理员的相关信息存入到JWT中 // 准备生成JWT的相关数据 Date date new Date(System.currentTimeMillis() durationInMinute * 60 * 1000); AdminDetails principal (AdminDetails) authenticationResult.getPrincipal(); MapString, Object claims new HashMap(); claims.put(id, principal.getId()); claims.put(username, principal.getUsername()); CollectionGrantedAuthority authorities principal.getAuthorities(); // 新增 String authoritiesJsonString JSON.toJSONString(authorities); // 新增 claims.put(authoritiesJsonString, authoritiesJsonString); // 新增然后在JwtAuthorizationFilter中调整 Long id claims.get(id, Long.class); String username claims.get(username, String.class); String authoritiesJsonString claims.get(authoritiesJsonString, String.class); // 新增 log.debug(从JWT中解析得到的管理员ID{}, id); log.debug(从JWT中解析得到的管理员用户名{}, username); log.debug(从JWT中解析得到的管理员权限列表JSON{}, authoritiesJsonString);// 将原有的“山寨”权限的代码替换为以下代码 // 将JSON格式的权限列表转换成Authentication需要的类型CollectionGrantedAuthority ListSimpleGrantedAuthority authorities JSON.parseArray(authoritiesJsonString, SimpleGrantedAuthority.class);最后在控制器中可以继续使用PreAuthroize注解检查权限 **注意**在API文档的调试中需要使用新的JWT数据 关于清空SecurityContext 目前当使用有效的JWT提交请求后即使下一次间隔时间不能太久不携带JWT再次提交请求也是服务器端认可的 这是因为当使用有效的JWT提交请求后JwtAuthorizationFilter会将此JWT中的信息创建为Authentication对象并将此Authentication保存到SecurityContext中而SecurityContext是基于Session的所以在Session未过期之前即使后续的请求没有携带JWTSpring Security仍能从Session中找到SecurityContext中的Authentication对象会视为此次访问与此前的访问是同一个客户端。 如果认为这是一种不合理的表现可以在JwtAuthorizationFilter中在执行过滤之初就不由分说的**清空SecurityContext**即可 // 清除SecurityContext中的数据 SecurityContextHolder.clearContext();处理未登录的错误 当客户端没有携带JWT却向需要通过认证的URL发起请求默认将响应403错误这种问题需要在Spring Security的配置类中的void configure(HttpSecurity http)方法中进行配置 // 处理“需要通过认证但是实际上未通过认证就发起的请求”导致的错误 http.exceptionHandling().authenticationEntryPoint(new AuthenticationEntryPoint() {Overridepublic void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) throws IOException, ServletException {String message 未检测到登录请登录在开发阶段看到此提示时请检查客户端是否携带了JWT向服务器端发起请求;JsonResultVoid jsonResult JsonResult.fail(ServiceCode.ERR_UNAUTHORIZED, message);response.setContentType(application/json; charsetutf-8);PrintWriter printWriter response.getWriter();printWriter.println(JSON.toJSONString(jsonResult));printWriter.close();} });关于Spring Security的认证流程 使用axios携带JWT发起请求 当需要携带JWT发起请求时根据业内惯例JWT应该放在请求头的Authorization属性中则使用axios时需要自定义请求头其语法是 // 以下调用的create()表示创建一个axios实例此函数的参数是一个对象用于表示新创建的axios的参数 this.axios.create({headers: {Authorization: jwt}}).get(); // 与此前使用相同在此处调用get()或post()发起请求关于复杂请求的预检机制导致的跨域问题 在使用了Spring Security框架的项目中当客户端携带JWT向服务器端发起异步请求默认会出现跨域访问的错误即使在服务器端通过Spring MVC配置类允许跨域此问题依然存在可以在Spring Security的配置类中的void configure(HttpSecurity http)方法中添加配置以解决此问题 http.cors();出现此问题的根本原因在于如果客户端提交的请求自定义了请求头中的特定属性例如配置了请求头中的Authorization属性此请求会被视为“复杂请求”客户端的浏览器会先向服务器端的此URL发起OPTIONS类型的请求执行“预检PreFlight”如果预检不通过则不允许提交原本尝试提交的请求。 所以可以在Spring Security的配置类中对所有OPTIONS类型的请求“放行”即可解决此问题 http.authorizeRequests() // 配置URL的访问控制// 重要以下2行代码表示对所有OPTIONS类型的请求“放行”.mvcMatchers(HttpMethod.OPTIONS, /**).permitAll().mvcMatchers(urls).permitAll().anyRequest().authenticated();或者通过http.cors();也可以解决此问题此方法的本质是启用了Spring Security自带的CorsFilter过滤器此过滤器会对OPTIONS请求放行。
http://www.dnsts.com.cn/news/164904.html

相关文章:

  • 青岛谁优化网站做的好量品定制和衣邦人哪个好
  • 嘉兴南湖区优秀营销型网站建设在社保网站做调动
  • 襄阳哪里有做网站的wordpress类似头条主题
  • seo网站项目微商城网站建设新闻
  • 做网站推广电话计算机网站模板
  • 网站建设?首选百川互动如何给网站弄ftp
  • 百度网站制作联系方式制作外贸网站的公司
  • 有一个wordpress站点合肥seo推广培训班
  • 网上销售型企业网站短网址生成平台
  • 东莞模块网站建设方案广西住房与城乡建设厅网站电话
  • 自己做门户网站电商商城系统免费
  • 高端网站设计高端网站制作做网站框架需要什么软件
  • 效果图seo推广每天做什么
  • 做网站还有前景吗淘宝网站怎么做网站
  • 网站建设推广方案如何开一家网络营销公司
  • 免费制作微信小程序的网站羊了个羊开发公司
  • 电子商务怎么做网站豌豆荚下载
  • 上海网站公司链接分析属于网站开发
  • 自己可以做网站推广吗wordpres做视频网站
  • 如何优化网站推广微网站开发公司
  • 赣州营销型网站策划论坛型网站 建站
  • 蔬莱网站建设做彩票网站违法的吗
  • 中国都有哪些网站二次开发创造作用
  • 西安高端网站开发浏阳seo公司
  • 怎么选择移动网站建设广州建设工程造价管理站
  • 软件营销网站wordpress密码正确登录不
  • 网站没有域名设置电脑版网页游戏
  • 台州网站排名公司亿网网络科技有限公司
  • 怎么做带网站连接的表格可以发广告的100个网站
  • 如何在网站上做免费代理怎么样才能引流客人进店