javaWeb进阶之Filter过滤器
摘要
实现了中文字符集设定和对未登录用户请求拦截。
Filter的生命周期
服务器开启时执行init,之后每一个请求都会执行doFilter操作,那么我们在doFilter处理每次请求即可。
关键代码
在doFilter中,设置request.setCharacterEncoding(UTF-8),就能实现中文字符集
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
String characterEncoding = config.getInitParameter("characterEncoding");
request.setCharacterEncoding(characterEncoding);
chain.doFilter(request, response);
}
详解Filter过滤未登陆用户
我们需要指定FIlter的作用连接,然后当用户请求这些url,该Filter过滤器就会按照生命周期进行活动,我们在doFilter中验证是否登陆了用户即可。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("------- doFilter create ---------");
HttpServletRequest hRequest = (HttpServletRequest) request;
HttpServletResponse hResponse = (HttpServletResponse)response;
User loginUser = (User)hRequest.getSession().getAttribute("user");
if(loginUser == null) {
// 有个问题,login.jsp也是请求,如何开发限定页面不受filter作用呢,答案就是设置web.xml
System.out.println("还没登陆啊,我要去: " + hRequest.getContextPath()+"/login.jsp");
hRequest.setAttribute("msg", "None login");
hResponse.sendRedirect(hRequest.getContextPath()+"/login.jsp");
return;
}else {
System.out.println("当前存在登陆对象啊: " + loginUser.getUsername());
chain.doFilter(request, response);
return;
}
}
添加多个匹配url
<filter>
<filter-name>authority</filter-name>
<filter-class>com.util.AuthorityFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>authority</filter-name>
<url-pattern>/pages/genbill/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>authority</filter-name>
<url-pattern>/pages/cmm/*</url-pattern>
</filter-mapping>
dispatcher 配置
1、request
也就是默认的配置
<filter-mapping>
<dispatcher>REQUEST<dispatcher>
</filter-mapping>
2、include
当前项执行的同时执行include的内容
<filter-mapping>
<dispatcher>INCLUDE<dispatcher>
</filter-mapping>
3、forword
forword的url通过request.getRequestDispatcher(xxx.jsp).forword(request,response重定向调用的话,过滤器触发
针对xxx.jsp的filter
<filter-mapping>
<url-pattern>/xxx.jsp</url-pattern>
<dispatcher>FORWORD<dispatcher>
</filter-mapping>
4、ERROR
在xxx.jsp下,触发了404,那么过滤器执行
<filter-mapping>
<url-pattern>/xxx.jsp</url-pattern>
<dispatcher>FORWORD<dispatcher>
</filter-mapping>
<error-page>
<error-code>404<error>
<location>404.jsp<error>
</error-page>
触发404的方法
response.sendError(404);