//顺序,请求在前放行到servlet后,二次经过过滤器后,再设置响应类型。
request.setCharacterEncoding("utf-8"); //解决post请求中文乱码
filterChain.doFilter(request,response); //放行
response.setContentType("text/html;charset=utf-8"); //响应给浏览器中文乱码
因为加载相应页面时,bootstrap会访问相应的css或者js文件。
如果过滤器设置了:response.setContentType(“text/html;charset=utf-8”);这名代码作怪
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
会导致:所有的响应都转换成为了html文件,使得css文件和js文件失效。
当页面需要请求css或者js时,服务器响应的时候却把这个css文件转换成了html文件(给请求的文件加上了一对html标签),所以css,js就失效了。
解决方案1:
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
解决方案2:
@WebFilter("/*")
public class EncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String uri = request.getRequestURI(); //获取请求链接中的请求地址。
String flag = request.getParameter("flag"); //获取请求当中的标记值。
if (uri.contains("img")||uri.contains("static")||uri.contains(".css")||uri.contains(".js")){ //如果访问的是静态资源,或者img里面的图片。要放行。
filterChain.doFilter(request,response); //让页面去下载静态资源。
return;
}
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
if (uri.contains("login")||"login".equals(flag)){ // 如果这里是登陆资源,就放你过。
filterChain.doFilter(request,response);
return;
}
//if (request.getServletContext().getAttribute(ConstUtil.LOG_USER)==null){ //当前application当中,没有登陆用户。
if (request.getSession().getAttribute(ConstUtil.LOG_USER)==null){ //当前session当中,没有登陆用户。
response.sendRedirect(request.getContextPath()+"/login.jsp");
return;
}
filterChain.doFilter(request,response); //放行
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
}