测试开发系列之——前后端联调&安全框架shiro

跨域请求

跨域请求需要在类上加@CrossOrigin

@RestController
@RequestMapping("/user")
@CrossOrigin
@Api("用户模块")
public class UserController

前端MD5加密

password:$.trim($.md5($("#password").val())),

后端参数验证

验证框架:
hibernate-validate数据校验框架,加入jar包

登录功能

用户名密码登录–token–oauth
OAuth 2.0 是目前最流行的授权机制,用来授权第三方应用,获取用户数据。

安全框架

  • shiro
  • springsecurity

安全框架shiro(Simple.Java.Security&easy to use)

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。

三个核心组建:

  • Subject:身份主体
  • SecurityManager:安全管理器
  • Realms:域
		<dependency>
    		<groupId>org.apache.shiro</groupId>
    		<artifactId>shiro-spring</artifactId>
    		<version>1.4.0</version>
		</dependency>

配置类
自定义Realms extends AuthorizingRealm
自定义SessionManager
在这里插入图片描述

shiro的配置

  • 创建package:com.one.shiro
  • 加入shiroConfiguration.java文件

只有放行3个,login、find、register,anon为匿名的意思,匿名的前几个字母,所谓匿名就是放行的意思。

// 配置不会被拦截的链接 顺序判断
		filterChainDefinitionMap.put("/user/login", "anon");
		filterChainDefinitionMap.put("/user/find", "anon");
		filterChainDefinitionMap.put("/user/register", "anon");

对其他全部进行拦截,authc是身份验证,前一个星通配第一层父路径,后一个星通配第二层子路径。

// authc:url都必须认证通过才可以访问; anon:url都可以匿名访问
		filterChainDefinitionMap.put("/**", "authc");

shiro实现原理

可参阅shiro框架详解:https://blog.csdn.net/pengjwhx/article/details/84867112

问题及解决方案

1、maven下载,jar包管理,依赖报错问题如何解决?
关键词涉及:lastUpdated 阿里云

依赖从本地仓库找,如果本地仓库没有,就从远程仓库下载,这个远程仓库有可能是公司的私服,也有可能是maven的中央仓库。不管是哪一种,都是要依赖网络的,也就是要保证在做依赖管理的时候,网络是顺畅的。如果网络下载速度不行,下载jar的时候,就会出现问题会报错,因为可能没有下载完整。
在本地仓库的文件夹下面,会出现一堆lastUpdated的文件,如果出现这个,就说明jar在下载的时候损坏了,jar包不完整。
解决方案一:
既然下载的jar包损坏,就把损坏的文件删除,重新下载。也就是说,如果某个jar包下载错误,就在本地仓库的对应目录下面找到出现lastUpdated的这种文件,把它全部删除,或者报错对应的文件夹全部删除,然后重新下载。
解决方案二:
如果网络不佳,因为中央仓库在国外,就不要去中央仓库下载了,建议改成对应的镜像路径,也就是阿里云。配置在settings.xml文件中。
终极操作:
在settings.xml文件中,配置阿里云后,仍然下载不成功的终极操作,确保万无一失。
步骤一:点击项目右键->Maven->Update Project
在这里插入图片描述
步骤二:强制更新打勾
☑️Force Update of Snapshots/Releases
在这里插入图片描述
2、修改了js文件,但是浏览器未及时刷新过来。
解决方案:建议使用浏览器的无痕模式,因为有可能是缓存,没有取更新之后的数据,代码已更新,但是浏览器仍然使用的是缓存数据。浏览方式改成无痕浏览,保证每次拿到的都是新的数据,否则每次都需要清除浏览器缓存,就比较麻烦。
3、springboot 子包问题
启动类放在com.one,其他的类放在启动类的子包下面,再次强调,一定是它的子包,否则可能会出现不可预知的错误。如果不是子包,会出现如下问题,register方法报404错误,不管是get请求,还是换用post请求。
在这里插入图片描述
加上注解@CrossOrigin,代码改用post方法请求,尝试请求register方法,问题依然存在。
在这里插入图片描述
用postman尝试请求register方法,请求不成功,问题依然存在。
在这里插入图片描述
还会出现Swagger可以访问,但是配置没有生效的问题。
在这里插入图片描述
用了默认demo项目的启动类DemoApplication.java不行(package:com.example.demo),重新写了个Starter类(package:com.one),请求成功,虽然代码一模一样,但是因为在不同的package下面,其他的类没有放在启动类的子包下面,所以出现问题。
在这里插入图片描述
问题解决,postman请求register方法成功。
在这里插入图片描述
swagger接口文档的问题也同时解决了,swagger接口文档可以访问,配置生效。
在这里插入图片描述
原因:启动类中写的注解@SpringBootApplication
是如下这些注解的集合体,有注解@ComponentScan(excludeFilters={@Filter(type=CUSTOM, classes={TypeExcludeFilter.class}),,它默认会去扫子包下面的配置或者说类,如果不是子包,扫描的时候,它就不会过去了,有一个扫描机制。扫描的话,只会扫描它的子包,它的这个包以及它子包下面的配置、类上面的注解或者是其他的注解。
在这里插入图片描述
比如说@Service注解,写在类上的,但是这个类必须作为启动类的子包才会被扫描到,如果不是它的子包,@Service就会找不到了。
在这里插入图片描述
4、需要优化:注册的 自动填充
注册时间未自动填充
持久化时间到数据库当中,可以修改UserController.java代码:

user.setRegtime(new Date());

自动填充注册时间如下图所示:
在这里插入图片描述
可以有统一的做法:MyBatis-Plus的自动填充功能
在这里插入图片描述
步骤一:创建子包com.one.handler
步骤二:新建类MyMetaObjectHandler.java,代码如下所示:

package com.one.handler;

import java.util.Date;
import org.apache.ibatis.reflection.MetaObject;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;

public class MyMetaObjectHandler implements MetaObjectHandler{
	@Override
	public void insertFill(MetaObject metaObject) {
		this.setFieldValByName("regtime", new Date(), metaObject);	
	}
	@Override
	public void updateFill(MetaObject metaObject) {	
	}
}
发布了27 篇原创文章 · 获赞 1 · 访问量 1660

猜你喜欢

转载自blog.csdn.net/anniewhite/article/details/104345794
今日推荐