目录
跨域请求
跨域请求需要在类上加@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) {
}
}