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

手机版网站优化网站建设要学哪些方面

手机版网站优化,网站建设要学哪些方面,泰州seo外包,旅游公司网站模板前言 在我的软件系统中,如果希望安全系数高一些的话,往往会有用户登陆行为表来记录用户登陆行为,保障用户账号安全,比如记录登陆地址,每次登陆时候读取数据最近几次登陆地点,进行账号安全验证 假如以下是我的用户登陆行为表 实现获取用户登陆地址的方法有很多种,比如通过前端整…前言 在我的软件系统中,如果希望安全系数高一些的话,往往会有用户登陆行为表来记录用户登陆行为,保障用户账号安全,比如记录登陆地址,每次登陆时候读取数据最近几次登陆地点,进行账号安全验证 假如以下是我的用户登陆行为表 实现获取用户登陆地址的方法有很多种,比如通过前端整合第三方gps库发送地址,也可以通过整合ip地址来查询,我这里采取第二种,既然已经获取到了ip,那么就直接使用ip进行解析 前端操作 首先在前后端项目中,前端文件时是部署给nginx来完成负载均衡的,这里我们看nginx的配置文件 nginx主配置 nginx.conf #user nobody; worker_processes 1;events {worker_connections 1024; } ##nginx.conf 把里面注释的内容和静态资源配置相关删除文件加载 http模块中有许多的server 一个server表示一个虚拟主机 http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;# 引入自定义配置文件include web.conf/*.conf; }这里我是将我前端的配置文件全部放在web.conf目录下的,所以主配置文件只需要负载导入 前端项目的具体 gate-way.conf (我的配置名) upstream admin-gateway{server localhost:51603; }server {listen 8803;location / {root html/admin-web/;index index.html;}location ~/service_6001/(.*) {proxy_pass http://admin-gateway/$1;proxy_set_header HOST $host; # 不改变源请求头的值proxy_pass_request_body on; #开启获取请求体proxy_pass_request_headers on; #开启获取请求头proxy_set_header X-Real-IP $remote_addr; # 记录真实发出请求的客户端IP 用于记录ipproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #记录代理信息} }解析: localtion模块配置前端读取的根目录listen该前端的端口upstream admin-gateway反向代理的具体地址proxy_set_header X-Real-IP $remote_addr; 重点是这个~/service_6001/(.*) 是一个正则表达式用于匹配以 “/service_6001/” 开头的请求路径并捕获括号内的内容。proxy_pass http://admin-gateway/$1; proxy_pass 用于指定被代理的服务器地址。 在这里http://admin-gateway 是代理目标的基础地址。 $1 是正则表达式中捕获的第一个分组的变量即括号内的内容。这是用于在代理目标中构建新的路径 比如 /service_6001/login 代理到admin-gateway就是localhost:51603/login 比如 此时真实请求地址是 localhost:51603/admin/login/in 后端操作 这里使用ip2region , Ip2region开源项目github地址https://github.com/lionsoul2014/ip2region。一个离线地址库可以根据ip地址来查询文件中的地址,准确率高达99.9%,吹的话就不说了,这里可以看github查看所有优点 这里直接将整合 导入依赖 !-- ip2region --dependencygroupIdorg.lionsoul/groupIdartifactIdip2region/artifactIdversion2.6.3/version/dependencydependencygroupIdcommons-io/groupIdartifactIdcommons-io/artifactIdversion2.6/version/dependencyip2region 用于 IP 地址解析提供了高性能的 IP 地址定位功能。 commons-io 提供了一些常见的、与 I/O 操作相关的工具类用于简化和增强 Java 的 I/O 操作。 下载离线数据集 去官网下载整个项目,需要的是解压后的data/xdb文件 然后新建ip2region目录把数据文件导入 目录结构 工具类 import org.apache.commons.io.FileUtils; import org.lionsoul.ip2region.xdb.Searcher;import java.io.File; import java.text.MessageFormat; import java.util.Objects;public class AddressUtil {/*** 当前记录地址的本地DB*/private static final String TEMP_FILE_DIR /home/admin/app/;/*** 根据IP地址查询登录来源** param ip* return*/public static String getCityInfo(String ip) {try {// 获取当前记录地址位置的文件String dbPath Objects.requireNonNull(AddressUtil.class.getResource(/ip2region/ip2region.xdb)).getPath();File file new File(dbPath);//如果当前文件不存在则从缓存中复制一份if (!file.exists()) {dbPath TEMP_FILE_DIR ip.db;System.out.println(MessageFormat.format(当前目录为:[{0}], dbPath));file new File(dbPath);FileUtils.copyInputStreamToFile(Objects.requireNonNull(AddressUtil.class.getClassLoader().getResourceAsStream(classpath:ip2region/ip2region.xdb)), file);}//创建查询对象Searcher searcher Searcher.newWithFileOnly(dbPath);//开始查询return searcher.searchByStr(ip);} catch (Exception e) {e.printStackTrace();}//默认返回空字符串return ;} //todo 测试public static void main(String[] args) {System.out.println(getCityInfo());} }测试这里ip是我的服务器 库有了,需要ip地址才能解析地方 获取请求ip 之前配置前端是携带真实请求地址的,那么只需要解析即可 这里我直接在controller进行解析 controller RestController RequestMapping(/login) public class LoginController { Autowired AdUserLoginService userService;PostMapping(/in)public ResponseResult login(RequestBody AdUserDto dto, HttpServletRequest request){String ipAddress request.getHeader(x-forwarded-for);if (ipAddress null || ipAddress.length() 0 || unknown.equalsIgnoreCase(ipAddress)) {ipAddress request.getHeader(Proxy-Client-IP);}if (ipAddress null || ipAddress.length() 0 || unknown.equalsIgnoreCase(ipAddress)) {ipAddress request.getHeader(WL-Proxy-Client-IP);}if (ipAddress null || ipAddress.length() 0 || unknown.equalsIgnoreCase(ipAddress)) {ipAddress request.getRemoteAddr();}System.out.println(登陆用户的ip地址为 ipAddress);return userService.login(dto,ipAddress);}}获取 x-forwarded-for 头部信息 x-forwarded-for 是一个常用的 HTTP 头部字段用于表示客户端的原始 IP 地址如果请求经过了代理服务器这个字段可能包含了多个 IP 地址通过逗号分隔。所以在这里首先尝试从这个字段中获取用户的 IP 地址。 如果 x-forwarded-for 为空或者为 “unknown”尝试获取其他头部信息 if (ipAddress null || ipAddress.length() 0 || unknown.equalsIgnoreCase(ipAddress)) {ipAddress request.getHeader(WL-Proxy-Client-IP); }如果 x-forwarded-for 为空或者为 “unknown”则尝试从其他可能包含用户 IP 地址的头部信息中获取。这包括 Proxy-Client-IP 和 WL-Proxy-Client-IP 头部。 3. 如果上述头部信息都未获取到有效的 IP 地址使用 request.getRemoteAddr() if (ipAddress null || ipAddress.length() 0 || unknown.equalsIgnoreCase(ipAddress)) {ipAddress request.getRemoteAddr(); }如果前面的头部信息都未获取到有效的 IP 地址最后使用 request.getRemoteAddr() 获取客户端的 IP 地址。 这里的controller路径是login开头而不是admin/开头是因为我这里使用了网关转发时候省略了前缀 spring:cloud:gateway:globalcors:add-to-simple-url-handler-mapping: true # 将全局CORS配置添加到SimpleUrlHandlerMappingcorsConfigurations:[/**]:allowedHeaders: * # 允许所有请求头allowedOrigins: * # 允许所有来源allowedMethods:- GET- POST- DELETE- PUT- OPTION# 允许的HTTP请求方法包括OPTIONS通常应该是OPTIONS而不是OPTIONroutes:- id: adminuri: lb://adminpredicates:- Path/admin/**filters:- StripPrefix 1#去掉请求路径中的一个前缀通常是去掉服务名的前缀 filters 下的 - StripPrefix1: 当请求匹配到这个路由规则时会执行此处定义的过滤器。StripPrefix1 表示去掉请求路径中的一个前缀。在这个场景下如果请求路径是 /admin/example经过这个过滤器后会将 /admin 去掉转发到后端服务的路径就变成了 /example。 好了这个不是重点,继续讲业务 测试controller是否能获取ip,测试成功 具体实现业务的 业务代码 Service Service public class AdUserLoginServiceImpl extends ServiceImplAdUserLoginMapper, AdUserLoginimplements AdUserLoginService { Autowired AdUserMapper adUserMapper;Overridepublic ResponseResult login(AdUserDto dto, String ipAddress) {//1.检查参数if(StringUtils.isBlank(dto.getName()) || StringUtils.isBlank(dto.getPassword())){return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID,用户名或密码为空);}//2.查询用户AdUser user adUserMapper.selectOne(Wrappers.AdUserlambdaQuery().eq(AdUser::getName, dto.getName()));if(user null){ // 说明没有该用户return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST);}//2.1.检查密码//3.比对密码String salt user.getSalt();String pwd dto.getPassword(); // 获取盐加密和数据库密码比较String codeepwd DigestUtils.md5DigestAsHex((pwd salt).getBytes());if(codeepwd.equals(user.getPassword())){//4.封装返回数据 jwtMapString,Object map new HashMap();map.put(token, AppJwtUtil.getToken(user.getId().longValue()));user.setSalt();user.setPassword();map.put(user,user); // 写入登陆行为AdUserLogin adUserLogin new AdUserLogin();adUserLogin.setUserId(user.getId());// 字符在字符串中的位置索引如果字符不存在则返回 -1。通过判断索引是否为 -1if (ipAddress.indexOf(,)!-1){ // 一样的效果 // ipAddressipAddress.split(,)[0];ipAddress ipAddress.substring(0,ipAddress.indexOf(,));}adUserLogin.setIp(ipAddress); // 保存用户登陆地址adUserLogin.setAddress(AddressUtil.getCityInfo(ipAddress));adUserLogin.setCreatedTime(new Date());save(adUserLogin);return ResponseResult.okResult(map);}else {return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);}} }
http://www.pierceye.com/news/154002/

相关文章:

  • app制作器手机版下载网站关键词优化排名怎么做
  • 网站站外优化推广方式网站建设网站需要什么软件有哪些
  • 重庆建设厂招聘信息网站做坑网站需要
  • 光谷 网站建设公司海珠区住房和水务建设局网站
  • 公司做网站还是做appwordpress多文件传递变量
  • 网站教学苏州优化网站
  • 扁平化网站下载网站设计公司深圳
  • flash网站用什么做网站建设免费软件有哪些
  • 卖车网站投资网站建设
  • 网站开发过程 文档合肥婚恋网站建设
  • 网站自助建设目录更新 wordpress
  • 百度给做网站吗flash网站制作教程 下载
  • 化工销售怎么做网站wordpress 论坛功能
  • 网上做平面设计兼职不错的网站网站 seo优化
  • seo做的最好的网站设计专业
  • 顾家家居网站是哪个公司做的东莞软件有限公司
  • 云南做网站哪家好wordpress文章内多页效果
  • 上海做网站公司哪家好建筑公司有哪些部门和职位
  • 用front page2003做网站的导航条网站的站点建设分为
  • 开封网站建设zducmwordpress评论ajax
  • 电脑如何做网站空间西安网站建设sxyun
  • 济南历城区网站建设2022年没封网站直接进入
  • 平面设计和网站建设哪个好icp备案可以自己搞吗
  • 平面电商网站建设初级网页设计
  • 个人购物网站怎么备案数据调查的权威网站
  • 网站规划和建设的基本要求100个无水印短视频素材免费
  • 河北住房和建设厅官方网站如何建设运输网站
  • 网络品牌网站建设价格网站设计部
  • 用自己照片做衣服 杯子的是哪个网站深圳东门老街
  • 四川省乐山市建设银行网站互联网保险行业发展报告