在ShiroFilterFactoryBean里添加shiro内置过滤器(通常是这样):
//常用的过滤器:
//anon:无需认证(登陆)可以访问
//authc:必须认证才可以访问
//user:如果使用rememberMe的功能可以直接访问
//perms:该资源必须得到资源权限才可以访问
//role:该资源必须得到角色权限才可以访问
Map<String,String> filterMap = new LinkedHashMap<String,String>();
filterMap.put("/testThymeleaf", "anon"); //放行
filterMap.put("/*", "authc"); //拦截
//修改跳转到的登陆页面,默认是跳到login.jsp
shiroFilterFactoryBean.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-8
response.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"));
}
参考:
Java 请求的@RequestBody