一、shiro问题
在ShiroFilterFactoryBean里添加shiro内置过滤器(通常是这样):
//常用的过滤器://anon:无需认证(登陆)可以访问//authc:必须认证才可以访问//user:如果使用rememberMe的功能可以直接访问//perms:该资源必须得到资源权限才可以访问//role:该资源必须得到角色权限才可以访问
Map<String,String> filterMap = new LinkedHashMap<String,String>();filterMap.put("/testThymeleaf", "anon"); //放行filterMap.put("/*", "authc"); //拦截//修改跳转到的登陆页面,默认是跳到login.jspshiroFilterFactoryBean.setLoginUrl("/tologin");shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
问题 出在LinkedHashMap上:
最开始定义的时候同事用的是HashMap
,然后往里面加入开放的接口(20个左右为anon的过滤),后来测的时候发现会有些接口没有生效。
解决 是换成了LinkedHashMap
就OK了。
注意 如果有的接口没有被放行,可能是控制层接口上加了权限的注解,这个时候在这里就要把路径写全才能放行。
注意 登录过期时间需要自己设置SecurityUtils.getSubject().getSession().setTimeout(Duration.ofDays(1).toMillis());
可能原因是HashMap不能保证map的顺序; 特别是,它不能保证顺序在一段时间内保持不变。 而LinkedHashMap是由于哈希表和链表实现的。它维持于所有条目的运行双向链表。
二、开发环境,登录超时无法自动跳转到登录界面问题
登录超时会有一个重定向到登录界面,服务器使用了Nginx。
在开发环境上无法自动跳转到登录界面,其他环境可以跳转。
我们开发环境设置的端口是88,(Nginx我无法查看,以后补充)
这里猜测是port_in_redirect
的问题,这个的功能是启用或禁用Nginx 发出的绝对重定向中指定端口 。
就是重定向的时候带不带端口。默认是打开的。
参考:Nginx重定向多出个端口号的问题,
HTTP跨域问题方案CORS
三、文件导出时中文名称出现乱码
后端做了导出功能,名称用的是中文名,用postman测试的时候导出的文件名是乱码。
private void exportFile(HttpServletResponse response, JSONObject content, String fileName) {
try (OutputStream outputStream = response.getOutputStream()) {
response.setHeader("content-type", "application/octet-stream");response.setContentType("application/octet-stream;charset=UTF-8");response.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName, StandardCharsets.UTF_8)+ ".json");outputStream.write(content.toString().getBytes());response.flushBuffer();} catch (IOException e) {
log.error("文件导出失败!", e);}}
以为问题出在setHeader的时候使用的是URLEncoder.encode(fileName, StandardCharsets.UTF_8)
。后来直接让前端调用发现没有乱码(chrome和firefox都没问题),看来是postman的问题了(具体没有去深究了)。
不过:如果真有问题的话可以
参考:
Java 解决浏览器下载文件中文名称出现乱码的原因?
,他是判断请求来自哪个浏览器,然后分别用不同的编码方式。
String agent = request.getHeader("USER-AGENT"); //获取浏览器的信息
if(agent != null && agent.toLowerCase().indexOf("firefox")>0){
//火狐浏览器自己会对URL进行一次URL转码所以区别处理response.setHeader("Content-Disposition","attachment; filename="+ new String(filePath.getBytes("GB2312"),"ISO-8859-1"));
}else if(agent.toLowerCase().indexOf("safari")>0){
//苹果浏览器需要用ISO 而且文件名得用UTF-8response.setHeader("Content-Disposition","attachment; filename="+ new String(filePath.getBytes("UTF-8"),"ISO-8859-1"));
}else{
//其他的浏览器response.setHeader("Content-Disposition","attachment; filename=\""+java.net.URLEncoder.encode(filePath, "UTF-8"));
}
四、@RequestBody
- Java中传输带附件和字段属性的form表单,这时候前端用的方式是 new FormData()的形式,属性添加用set 文件流添加用append, postman中传输对应的是from-data。->controller层,接收,这时候就不要加注解@RequestBody;
- 如果传输普通的form表单(不带附件),那前端用的就是raw的形式,postman也是raw的形式->controller层,要用@RequestBody注解,这样前端或者postman raw中传递的属性值,就和 @RequestBody注解 后面的Param参数的属性一一对应的上了,相应的校验Validate也能使用。
参考:
Java 请求的@RequestBody
五、其他记录
- java导出json格式文件的示例代码
- stream
- mybatis的mapper返回map结果集
- 使用IDEA进行commit合并(折叠)