一.解决全站编码
思路:1)若为get:创建自己的request类实现HttpServletRequestWrapper接口,重写其中getParameter()方法,将自己的自己的request传出去.
(!其实这一步在tmcat8以后就不用了!!!因为默认utf-8编码,所以只解决post即可.
2)若为post:req.setCharacterEncoding("UTF-8");
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//!!!将ServletRequest转为HttpServletRequest
HttpServletRequest req=(HttpServletRequest)request;
//判断请求方式
if(req.getMethod().equals("GET")) {
System.out.println("fggg");
HttpServletRequestWrapper rw=new HttpServletRequestWrapper(req) {
@Override
public String getParameter(String name) {
String s=request.getParameter(name);
try {
s=new String(s.getBytes("ISO-8859-1"),"UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return s;
};
};
chain.doFilter(rw, response);
return ;
}else if(req.getMethod().equals("POST")) {
System.out.println("fpp");
req.setCharacterEncoding("UTF-8");
chain.doFilter(req, response);
}
}
二.粗粒度访问
思路:1)登录时在session中存用户信息.
2)将权限不同的页面放在不同的包中.为每种权限设置一个过滤器过滤.
3)过滤器中取出session,判断用户信息是否可以通过.若通过则放行,不通过转发到其他页面并显示提示信息
例子:普通用户的filter
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest)request;
String user=(String) req.getSession().getAttribute("user");
if(user!=null) {
chain.doFilter(request, response);
return ;
}
String admin=(String) req.getSession().getAttribute("admin");
if(admin!=null) {
chain.doFilter(request, response);
return;
}
String msg="请先登录!";
req.setAttribute("msg", msg);
req.getRequestDispatcher("/all/login.jsp").forward(req, response);
}
<filter>
<filter-name>user</filter-name>
<filter-class>filter.userFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>user</filter-name>
<url-pattern>/user/*</url-pattern>
三.四种拦截方式
REQUEST:
直接访问目标资源时执行过滤器。包括:在地址栏中直接访问、表单提交、超链接、重定向,只要在地址栏中可以看到目标资源的路径,就是REQUEST;
FORWARD:
转发访问执行过滤器。包括RequestDispatcher#forward()方法,<jsp:forward>标签都是转发访问;
INCLUDE:
包含访问执行过滤器。包括RequestDispatcher#include()方法,<jsp:include>标签都是包含访问;
ERROR:
当目标资源在web.xml中配置为<error-page>中时,并且真的出现了异常,转发到目标资源时,会执行过滤器。
配置:(可配置多个)- <dispatcher>REQUEST</dispatcher>