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

食药监局网站建设方案商城网站怎么做seo

食药监局网站建设方案,商城网站怎么做seo,做慧聪网站多少钱,网站邮件设置系统的登录#xff0c;都做些什么#xff1f;用户访问登录页时#xff1a;会发起一个获取图片验证码的请求#xff0c;后端先生成一个uuid代表此次的验证码,接着生成 ab?答案 的表达式#xff0c;将前面的内容转换成流生成图片#xff0c;后面的答案则存储到…系统的登录都做些什么用户访问登录页时会发起一个获取图片验证码的请求后端先生成一个uuid代表此次的验证码,接着生成 ab?答案 的表达式将前面的内容转换成流生成图片后面的答案则存储到redis中设为2分钟过期将图片和uuid传给前端。/*** 生成验证码*/GetMapping(**/captchaImage)public AjaxResult getCode(HttpServletResponse response) throws IOException{AjaxResult ajax AjaxResult.success();boolean captchaOnOff configService.selectCaptchaOnOff();ajax.put(captchaOnOff, captchaOnOff);if (!captchaOnOff){return ajax;}// 保存验证码信息String uuid IdUtils.simpleUUID();String verifyKey Constants.CAPTCHA_CODE_KEY uuid;String capStr null, code null;BufferedImage image null;// 生成验证码String captchaType RuoYiConfig.getCaptchaType();if (math.equals(captchaType)){String capText captchaProducerMath.createText();capStr capText.substring(0, capText.lastIndexOf());code capText.substring(capText.lastIndexOf() 1);image captchaProducerMath.createImage(capStr);}else if (char.equals(captchaType)){capStr code captchaProducer.createText();image captchaProducer.createImage(capStr);}redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);// 转换流信息写出FastByteArrayOutputStream os new FastByteArrayOutputStream();try{ImageIO.write(image, jpg, os);}catch (IOException e){return AjaxResult.error(e.getMessage());}ajax.put(uuid, uuid);ajax.put(img, Base64.encode(os.toByteArray()));return ajax;}发起登录请求后端会先根据图片uuid从redis中取出验证码进行校验校验通过则执行下面代码SpringSecurity框架就会对账号密码进行一系列的过滤器进行验证和授权等其中最重要的两个过滤器就是UsernamePasswordAuthenticationFilter负责登录认证FilterSecurityInterceptor负责权限授权。// 用户验证当前登录用户的认证信息 Authentication authentication null;// 该方法会去调用UserDetailsServiceImpl.loadUserByUsername authentication authenticationManager. authenticate(new UsernamePasswordAuthenticationToken(username, password));Spring Security大致源码Override public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {...省略其他代码// 获取Spring Security的一套过滤器ListFilter filters getFilters(request);// 将这一套过滤器组成Spring Security自己的过滤链并开始执行VirtualFilterChain vfc new VirtualFilterChain(fwRequest, chain, filters);vfc.doFilter(request, response);...省略其他代码 }Spring Security的核心逻辑全在这一套过滤器中过滤器里会调用各种组件完成功能掌握了这些过滤器和组件你就掌握了Spring Security当然我还没全部掌握还要继续学习这里面我们只需要重点关注两个过滤器即可UsernamePasswordAuthenticationFilter负责登录认证FilterSecurityInterceptor负责权限授权。SpringSecurity配置类EnableGlobalMethodSecurity(prePostEnabled true, securedEnabled true) public class SecurityConfig extends WebSecurityConfigurerAdapter {/*** 自定义用户认证逻辑*/Autowiredprivate UserDetailsService userDetailsService;/*** 认证失败处理类*/Autowiredprivate AuthenticationEntryPointImpl unauthorizedHandler;/*** 退出处理类*/Autowiredprivate LogoutSuccessHandlerImpl logoutSuccessHandler;/*** token认证过滤器*/Autowiredprivate JwtAuthenticationTokenFilter authenticationTokenFilter;/*** 跨域过滤器*/Autowiredprivate CorsFilter corsFilter;/*** 解决 无法直接注入 AuthenticationManager** return* throws Exception*/BeanOverridepublic AuthenticationManager authenticationManagerBean() throws Exception{return super.authenticationManagerBean();}/*** anyRequest | 匹配所有请求路径* access | SpringEl表达式结果为true时可以访问* anonymous | 匿名可以访问* denyAll | 用户不能访问* fullyAuthenticated | 用户完全认证可以访问非remember-me下自动登录* hasAnyAuthority | 如果有参数参数表示权限则其中任何一个权限可以访问* hasAnyRole | 如果有参数参数表示角色则其中任何一个角色可以访问* hasAuthority | 如果有参数参数表示权限则其权限可以访问* hasIpAddress | 如果有参数参数表示IP地址如果用户IP和参数匹配则可以访问* hasRole | 如果有参数参数表示角色则其角色可以访问* permitAll | 用户可以任意访问* rememberMe | 允许通过remember-me登录的用户访问* authenticated | 用户登录后可访问*/Overrideprotected void configure(HttpSecurity httpSecurity) throws Exception{httpSecurity// CSRF禁用因为不使用session.csrf().disable()// 认证失败处理类.exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()// 基于token所以不需要session.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()// 过滤请求.authorizeRequests()// 对于登录login 注册register 验证码captchaImage 允许匿名访问.antMatchers(/login, /api/pwd/login, /api/phone/*, /api/email/login, /register, /**/captchaImage,/info/member/selectMemByName,/sys/message/getMessageCode, /info/member,/back/oss/upload).anonymous().antMatchers(HttpMethod.GET,/,/*.html,/**/*.html,/**/*.css,/**/*.js,/profile/**,/controller/appMenu/list).permitAll().antMatchers(/swagger-ui.html).anonymous().antMatchers(/swagger-resources/**).anonymous().antMatchers(/webjars/**).anonymous().antMatchers(/*/api-docs).anonymous().antMatchers(/druid/**).anonymous()// 除上面外的所有请求全部需要鉴权认证.anyRequest().authenticated().and().headers().frameOptions().disable();httpSecurity.logout().logoutUrl(/logout).logoutSuccessHandler(logoutSuccessHandler);// 添加JWT filterhttpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);// 添加CORS filterhttpSecurity.addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class);httpSecurity.addFilterBefore(corsFilter, LogoutFilter.class);}/*** 强散列哈希加密实现*/Beanpublic BCryptPasswordEncoder bCryptPasswordEncoder(){return new BCryptPasswordEncoder();}/*** 身份认证接口*/Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception{auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder());} }JWT生成token先生成一个uuid代表当前登录对象含用户的权限信息然后将此登录对象存到redis中key是uuid接着JWT根据这个uuid以及签名密钥加密生成token public String createToken(LoginUser loginUser){String token IdUtils.fastUUID();loginUser.setToken(token);setUserAgent(loginUser);refreshToken(loginUser);MapString, Object claims new HashMap();claims.put(Constants.LOGIN_USER_KEY, token);return createToken(claims);}JWT生成的token以下加密的tokeneyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjU0ZWQwOWJmLTA4OTgtNDI5OC1hYTYzLTEyNmQ2MTNiNDk5ZSJ9.wNI9cYMOpfSDhcECVHpF3yxVLQbefs7vJl2lRaGlBmDckIvV1U2_PrS1CyQoE53sGgDzZEXfbyeHSmqhGH0NQ它是一个很长的字符串中间用点.分隔成三个部分。JWT生成的token包括以下三个部分Header头部Payload负载Signature签名Header.Payload.SignatureHeader(头部Header 部分是一个 JSON 对象描述 JWT 的元数据通常是下面的样子。{alg:HS256,typ:JWT}alg属性表示签名的算法algorithm默认是 HMAC SHA256写成 HS256typ属性表示这个令牌token的类型typeJWT 令牌统一写为JWT。Payload负载Payload 部分也是一个 JSON 对象用来存放实际需要传递的数据。JWT 规定了7个官方字段供选用。iss (issuer)签发人exp (expiration time)过期时间sub (subject)主题aud (audience)受众nbf (Not Before)生效时间iat (Issued At)签发时间jti (JWT ID)编号除了官方字段还可以在这个部分自定义字段可以将代表当前用户的uuid设置进去{login_user_key2e80aa6d-d849-444d-9cbf-0f5a86d48db4},Signature(签名)Signature 部分是对前两部分的签名防止数据篡改防止别人仿造token。首先需要指定一个密钥secret。这个密钥只有服务器才知道不能泄露给用户。然后使用 Header 里面指定的签名算法默认是 HMAC SHA256按照下面的公式产生签名。前端保存token客户端收到服务器返回的经JWT加密后的token后可以储存在 Cookie 里面也可以储存在 localStorage。此后客户端每次与服务器通信都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送但是这样不能跨域可以在前端配置代理服务器解决所以更好的做法是放在 HTTP 请求的头信息Authorization字段里面。此后每次发请求做些什么1、登录验证用户发送请求时会经过一个前端的一个请求拦截器判断是否需要携带token默认所有的请求都是携带token的除了一些登录、注册的请求需要手动设置不带token。发送请求后后端设置了一个token验证过滤器先取出请求头中的token然后解析这个由jwt加密后的token接着取出token中的负载信息也就是代表当前登录用户的uuid。接着取出redis中登录的用户对象含权限信息先验证token有效期若低于20分钟则刷新redis中的用户对象有效期防止产生频繁登录影响体验最后将取出的用户对象放入SpringSecurity的安全上下文中通过登录验证后则执行用户原本请求的接口。若没通过验证则执行自定义的未授权处理类返回未授权提示。/*** token过滤器 验证token有效性** 会拦截所有的请求,进行登录认证,认证成功则放行,否则执行AuthenticationEntryPointImpl类中的方法** author ruoyi*/ Component public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {Autowiredprivate TokenService tokenService;Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)throws ServletException, IOException{LoginUser loginUser tokenService.getLoginUser(request);if (StringUtils.isNotNull(loginUser) StringUtils.isNull(SecurityUtils.getAuthentication())){tokenService.verifyToken(loginUser);UsernamePasswordAuthenticationToken authenticationToken new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));// SpringSecurity 将当前登录用户的认证信息存到安全上下文中SpringSecurity判断有没有登录的标志就是看安全上下文中有没有持有认证信息SecurityContextHolder.getContext().setAuthentication(authenticationToken);}chain.doFilter(request, response);} }
http://www.hkea.cn/news/14301999/

相关文章:

  • 网站建设通讯设备中企动力网店网站设计
  • 网站开发与制作工资科技资讯
  • 安徽省校园网站建设一个网站开发背景是什么
  • 网站建设c云世家宋南南wordpress转成繁体
  • 外贸跨境电商网站建设开发网站展现形式
  • 织梦网站仿站wordpress的翻译文件
  • 学做饼干的网站免费制作软件的网站
  • 南京网站建设公司 雷仁网络网站建设和优司怎么样
  • 襄阳市建设局网站西安搭建网站
  • php网站开发数据列表排重网站管理密码
  • 多php网站空间编程代码大全
  • 门户网站要求百姓网58同城
  • 工控人如何做自己的网站网站如何被手机端收录
  • 网站新闻详细页面设计学做网站的书哪些好
  • 数码公司网站建设的意义电脑版 做网站尺寸
  • 做网站用php个人网站可以做音乐下载网
  • 官方网站模板自己做的网站怎么设置地址
  • 微信公众号h5网站开发优化系统设置
  • 电子商务网站建设试题二怎样建立一个微信公众号
  • 网站后台密码破解教程动漫做的游戏 迅雷下载网站有哪些
  • 小程序建站公司网站标ico怎么做
  • html5 手机 手机网站wordpress内页404
  • 企业网站 建设 外包中国建设银行官网站招聘
  • 做网站还有前景么做街机棋牌上什么网站发广告
  • 海口本地网站网页设计图片的边框怎么做
  • 表述网站建设流程陕西高速公路建设集团公司网站
  • 施工者网官网长春seo排名优化
  • 外贸网站推广建设wordpress 菜单对应分类目录
  • 易经网站建设应用国内网页设计培训
  • 网站策划编辑招聘上海建设厅焊工证查询网站