我部署了一个Java web应用,项目全部采用utf-8编码,在web.xml中配置了两个页面需要经过过滤器的登录和权限判定处理,其他页面不做处理,如下:
<init-param>
<param-name>filterPages</param-name>
<param-value>/main.html,/admin/adminMain.html</param-value>
</init-param>
</filter>
启动tomcat后,开始都能正常访问,也没有乱码。
于是乎,我某天在ie下将访问main.html时,邮件将编码从utf-8改为了gbk,出现了乱码,然后我又改回了utf-8,此时页面的title和页面上的两个超链接上的文字都变成了乱码:
服务器上的文件编码都是正常的,我在未手动修改浏览器中页面编码前都正常,就是改了后才出现该问题,而且自从我改了以后在其他人的电脑上访问也有这个问题,实在不明白我在浏览器上做了修改怎么就影响到服务器上了呢?
重启tomcat,重新部署项目都没用,今天将main.html文件重命名为a.html后再访问又一切正常,才发现应该是Filter搞的鬼,可是我在过滤器中也没做什么特殊处理,为何如此呢?Filter的代码如下:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
HttpServletRequest httpRequest = (HttpServletRequest)request;
String rootPath=httpRequest.getContextPath();
String path = httpRequest.getServletPath();
System.out.println(path);
if(StringUtil.splitAllToArrayList(filterPages).contains(path)){
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
HttpSession session = httpRequest.getSession();
String isLogin = (String) session.getAttribute("isLogin");
if(isLogin == null || !isLogin.equals("yes")){
out.print("<script type=\"text/javascript\">");
out.print("alert('您还没有登录,请先登录!');window.location='"+rootPath+"/login.html';");
out.print("</script>");
}
else{
String userAccount = (String) session.getAttribute("userAccount");
Dao dao = DaoFactory.getDao();
List<Role> roles =dao.query(Role.class, Cnd.wrap("userAccount='"+userAccount+"'"));
List<String> roleNames = new ArrayList<>();
for (Role role : roles) {
roleNames.add(role.getRole());
}
//登录后直接访问该地址时验证
if("/admin/adminMain.html".equals(path) && ! roleNames.contains("administrator")){
out.print("<script type=\"text/javascript\">");
out.print("alert('您没有访问权限!');window.location='"+rootPath+"/login.html';");
out.print("</script>");
}else
chain.doFilter(request, response);
}
out.close();
}else {
chain.doFilter(request, response);
}
}
<init-param>
<param-name>filterPages</param-name>
<param-value>/main.html,/admin/adminMain.html</param-value>
</init-param>
</filter>
启动tomcat后,开始都能正常访问,也没有乱码。
于是乎,我某天在ie下将访问main.html时,邮件将编码从utf-8改为了gbk,出现了乱码,然后我又改回了utf-8,此时页面的title和页面上的两个超链接上的文字都变成了乱码:
服务器上的文件编码都是正常的,我在未手动修改浏览器中页面编码前都正常,就是改了后才出现该问题,而且自从我改了以后在其他人的电脑上访问也有这个问题,实在不明白我在浏览器上做了修改怎么就影响到服务器上了呢?
重启tomcat,重新部署项目都没用,今天将main.html文件重命名为a.html后再访问又一切正常,才发现应该是Filter搞的鬼,可是我在过滤器中也没做什么特殊处理,为何如此呢?Filter的代码如下:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
HttpServletRequest httpRequest = (HttpServletRequest)request;
String rootPath=httpRequest.getContextPath();
String path = httpRequest.getServletPath();
System.out.println(path);
if(StringUtil.splitAllToArrayList(filterPages).contains(path)){
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
HttpSession session = httpRequest.getSession();
String isLogin = (String) session.getAttribute("isLogin");
if(isLogin == null || !isLogin.equals("yes")){
out.print("<script type=\"text/javascript\">");
out.print("alert('您还没有登录,请先登录!');window.location='"+rootPath+"/login.html';");
out.print("</script>");
}
else{
String userAccount = (String) session.getAttribute("userAccount");
Dao dao = DaoFactory.getDao();
List<Role> roles =dao.query(Role.class, Cnd.wrap("userAccount='"+userAccount+"'"));
List<String> roleNames = new ArrayList<>();
for (Role role : roles) {
roleNames.add(role.getRole());
}
//登录后直接访问该地址时验证
if("/admin/adminMain.html".equals(path) && ! roleNames.contains("administrator")){
out.print("<script type=\"text/javascript\">");
out.print("alert('您没有访问权限!');window.location='"+rootPath+"/login.html';");
out.print("</script>");
}else
chain.doFilter(request, response);
}
out.close();
}else {
chain.doFilter(request, response);
}
}