javaWeb进阶之Filter过滤器

摘要

实现了中文字符集设定和对未登录用户请求拦截。

Filter的生命周期

服务器开启时执行init,之后每一个请求都会执行doFilter操作,那么我们在doFilter处理每次请求即可。

javaWeb进阶之Filter过滤器

关键代码

在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);