1,引入js的问题
<script type="text/javascript" src="/js/bootstrap/js/bootstrap.min.js"></script>
引入时,不能省略结束标签,不能这样写
<script type="text/javascript" src="/js/bootstrap/js/bootstrap.min.js"/>
2,高并发时遇到的线程安全问题
单例模式,高并发的情况下,单例类必须是无状态的,不能出现全局变量和静态变量,继承的类中也不可以出现全局变量。
3,ajax请求时报400的问题
可能是表单和参数的类型不一致,也可能是表单转化成javabean时,类型不一致。(表单提交的类型都是string类型)
4,@Autewera注入为null
可能是某个地方直接new了注入bean的类,导致这个类中不能被spring容器注入bean。
4.1@Autewera注入为null
再一次遇到@autewera注入为null的问题,可能是spring容器加载的问题
5,Spring中使用@Autowired注解静态实例对象
不能@Autowired一个静态变量,使之成为一个Spring bean的。为什么?其实很简单,因为当类加载器加载静态变量时,Spring上下文尚未加载。所以类加载器不会在bean中正确注入静态类,并且会失败。
解决办法,建一个静态实例的setter方法,
private static SortService sortService;
@Autowired
public void setSortService(SortService sortService){
SortUtil.sortService=sortService;
}
6,字段名与mybatis关键字冲突
冲突时在字段外面添加反单引号
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, title, contect, author, create_time, status, `like`, look, review, heat, top, `type`, release_form
</sql>
7,ajax提交没有返回值的问题
触发提交的按钮不能是button,问题就出在这个form标签,button按钮放在form标签内就不能接收到数据,放到form标签外就没事,可以是input 标签type=button
[连接](https://blog.csdn.net/to10086/article/details/101030558)
8,shiro过滤器,过滤器拦截器优先级问题
过滤器Filter的优先级是要大于springMVC的拦截器Interceptor的。或者说,当有访问来到时,是先执行Filter里的逻辑,然后在执行Interceptor的。而shiro的Filter会代理web的Filter,所以会先执行shiro的过滤器在执行springMVC的拦截器。
————————————————
原文链接:https://blog.csdn.net/tyoukai_/article/details/78480359
如果in查询是在符合最左原则的前提下,是可以正常使用的索引的。但是如果in查询的前面有范围查询,那么联合索引失效,自然我们的in查询也就用不到索引了
mybatis二级缓存默认开启
二级缓存的使用原则
9,只能在一个命名空间下使用二级缓存
1,由于二级缓存中的数据是基于namespace的,即不同namespace中的数据互不干扰。在多个namespace中若均存在对同一个表的操作,那么这多个namespace中的数据可能就会出现不一致现象。
2,在单表上使用二级缓存如果一个表与其它表有关联关系,那么久非常有可能存在多个namespace对同一数据的操作。而不同namespace中的数据互补干扰,所以就有可能出现多个namespace中的数据不一致现象。
,3,查询多于修改时使用二级缓存
在查询操作远远多于增删改操作的情况下可以使用二级缓存。因为任何增删改操作都将刷新二级缓存,对二级缓存的频繁刷新将降低系统性能。
10,@PostConstruct注解与@PreDestroy
Java中该注解的说明:@PostConstruct该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。
组合生命周期机制
从Spring 2.5开始, 可以使用三个选项来控制Bean生命周期行为:
InitializingBean和DisposableBean回调接口 自定义init()和destroy()方法
@PostConstruct和@PreDestroy注解。 可以结合使用这些机制来控制给定的bean。
如果为一个bean配置了多个生命周期机制,并且为每个机制配置了不同的方法名称,则将按照下面列出的顺序执行每个已配置的方法。 但是,如果为多个生命周期机制中的多个生命周期机制配置了相同的方法名称,则该方法将执行一次。就是 xml 配置了 注解也加了 同样的方法 方法只会执行一次。
为同一个bean配置的具有不同初始化方法的多种生命周期顺序如下:
方法上面添加注解 @PostConstruct
afterPropertiesSet() 由InitializingBean回调接口定义
定制配置的init()方法
销毁方法的调用顺序相同:
用@PreDestroy注解的方法
由DisposableBean回调接口定义的destroy()
定制配置的destroy()方法
11,重写hashcode后导致的内存泄露问题
重写hashcode方法的类对象,在放入hash表后,一定要谨慎操作对象字段属性值。如果要修改,先从哈希表中删除该对象,修改后再放入哈希表。
https://blog.csdn.net/iteye_555/article/details/82551645
12,跨域
方法一:在controller中加上注解@CrossOrigin
@Controller
@CrossOrigin
public class LoginController extends BaseController {
方法二:使用网关
@Configuration
public class CorsConfig {
@Bean
public CorsWebFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedMethod("*");
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
source.registerCorsConfiguration("/**", config);
return new CorsWebFilter(source);
}
}
方法三:使用过滤器
@WebFilter("/*")
public class SimpleCORSFilter implements Filter{
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
chain.doFilter(req, res);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
13,js方法
Object.assign()
Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象分配到目标对象。它将返回目标对象。
Array.prototype.some()
some() 方法测试数组中是不是至少有1个元素通过了被提供的函数测试。它返回的是一个Boolean类型的值。
function hasPermission(roles, route) {
if (route.meta && route.meta.roles) {
return roles.some(role => route.meta.roles.includes(role))
} else {
return true
}
}