shiro问题+重定向问题+文件导出乱码问题+@requestBody+其他(java格式化json参考、mybatis返回map结果集)=2020/11/30~12/11

一、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.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"));
}

四、@RequestBody

  1. Java中传输带附件和字段属性的form表单,这时候前端用的方式是 new FormData()的形式,属性添加用set 文件流添加用append, postman中传输对应的是from-data。->controller层,接收,这时候就不要加注解@RequestBody;
  2. 如果传输普通的form表单(不带附件),那前端用的就是raw的形式,postman也是raw的形式->controller层,要用@RequestBody注解,这样前端或者postman raw中传递的属性值,就和 @RequestBody注解 后面的Param参数的属性一一对应的上了,相应的校验Validate也能使用。

参考:
Java 请求的@RequestBody

五、其他记录

  1. java导出json格式文件的示例代码
  2. stream
  3. mybatis的mapper返回map结果集
  4. 使用IDEA进行commit合并(折叠)

你可能感兴趣的:(mybatis,java,shiro,乱码,java,http)