Filter用法
一、过滤请求,没登录的情况(session不存),请求资源(没有安全框架的前提)
1.SessionFilter类
package com.huaxia.base.utils;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
/**
* Session Filter,用来控制请求 其中参数logonPages,登陆页面 includePages,哪些页面需要过滤.
* redirectPath,没有登陆时的转向页面 userAttributeName Session中“用户”对象的标示名
* disabletestfilter,过滤器是否有效。
* @author spring
* @since 2006.1.12
*/
public class SessionFilter implements Filter {
/**
* 判断字符串里是否包含指定的字符模式.
* @param container 要判断的字符串 .
* @param regx 匹配的字符模式 .
* @return boolean .
*/
private static boolean isContains(String container, String[] regx) {
boolean result = false;
for (String item : regx) {
if (container.indexOf(item) != -1) {
return true;
}
}
return result;
}
/**
* sevelet Filter Config.
*/
private FilterConfig config = null;
/**
* 本过滤器是否失效.
*/
private boolean disableFilter = false;
/**
* 用来判断Sessoin 是否登陆过.
*/
private String userAttributeName = null;
/**
* 系统的登陆页面.
*/
private String[] loginPages = null;
/**
* 没有登陆时的重定向页面(一般同登陆页面).
*/
private String redirectPath = null;
/**
* 设置完FilterConfig之后的逻辑.
*/
public void afterSetFilterConfig() {
disableFilter = "Y".equalsIgnoreCase(config
.getInitParameter("disabletestfilter"));
userAttributeName = config.getInitParameter("userAttributeName");
String loginStrings = config.getInitParameter("loginPages");
loginPages = loginStrings.split(";");
redirectPath = config.getInitParameter("redirectPath");
}
/**
* 进行request filter.
* @param request http request
* @param response http response
* @param chain filer chain
* @throws IOException io exception
* @throws ServletException servlet exception
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpreq = (HttpServletRequest) request;
HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper(
(HttpServletResponse) response);
if (disableFilter) {
chain.doFilter(request, response);
return;
}
if (isContains(httpreq.getRequestURI(), loginPages)) {
chain.doFilter(request, response);
return;
}
Object user = httpreq.getSession().getAttribute(userAttributeName);
if (user == null) {
wrapper.sendRedirect(redirectPath);
} else {
chain.doFilter(request, response);
}
}
/**
* 初始化.
* @param filterConfig servlet filter config
* @throws ServletException sevlet exception when error
*/
public void init(FilterConfig filterConfig) throws ServletException {
this.config = filterConfig;
this.afterSetFilterConfig();
}
/**
* destroy.
*/
public void destroy() {
// nothing to do
}
}
2.web.xml里面配置
<!-- 登陆Session控制过滤器 -->
<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>com.huaxia.base.utils.SessionFilter</filter-class>
<init-param>
<param-name>userAttributeName</param-name>
<param-value>HUAXIA_CURRENT_USER</param-value>
</init-param>
<init-param>
<param-name>loginPages</param-name>
<param-value>login.jsp;Login.do;trade/personalOrderReq.do;query/prodList.do;query/personalProdList.do;query/orderResult.do;trade/orderReq.do;trade/orderReply.do;query/trafficQuery.do;trade/xinhuaTelcom/orderReply.do;trade/telcom/orderReply.do;trade/osai/orderReply.do;trade/tongyi/orderReply.do;/trade/xinhao/orderReply</param-value>
</init-param>
<init-param>
<param-name>redirectPath</param-name>
<param-value>login.jsp</param-value>
</init-param>
<init-param>
<param-name>disabletestfilter</param-name>
<param-value>N</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
二、登录强制修改登录密码
1.RemindChangePasswordFilter 类
package com.huaxia.auth.utils;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
public class RemindChangePasswordFilter implements Filter {
/**
* 判断字符串里是否包含指定的字符模式.
* @param container 要判断的字符串 .
* @param regx 匹配的字符模式 .
* @return boolean .
*/
private static boolean isContains(String container, String[] regx) {
boolean result = false;
for (String item : regx) {
if (container.indexOf(item) != -1) {
return true;
}
}
return result;
}
/**
* sevelet Filter Config.
*/
private FilterConfig config = null;
/**
* 本过滤器是否失效.
*/
private boolean disableFilter = false;
/**
* 用来判断是否需要强制修改密码.
*/
private String forcedToChangePassword = null;
/**
* 系统的登陆页面.
*/
private String[] loginPages = null;
/**
* 没有完成密码修改时的重定向页面.
*/
private String redirectPath = null;
/**
* 设置完FilterConfig之后的逻辑.
*/
public void afterSetFilterConfig() {
disableFilter = "Y".equalsIgnoreCase(config
.getInitParameter("disabletestfilter"));
String loginStrings = config.getInitParameter("loginPages");
loginPages = loginStrings.split(";");
forcedToChangePassword = config.getInitParameter("forcedToChangePassword");
redirectPath = config.getInitParameter("redirectPath");
}
/**
* 进行request filter.
* @param request http request
* @param response http response
* @param chain filer chain
* @throws IOException io exception
* @throws ServletException servlet exception
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpreq = (HttpServletRequest) request;
HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper(
(HttpServletResponse) response);
if (disableFilter) {
chain.doFilter(request, response);
return;
}
if (isContains(httpreq.getRequestURI(), loginPages)) {
chain.doFilter(request, response);
return;
}
Object forcedToChangePasswordFlag = httpreq.getSession().getAttribute(forcedToChangePassword);
if (forcedToChangePasswordFlag != null) {
wrapper.sendRedirect(redirectPath);
} else {
chain.doFilter(request, response);
}
}
/**
* 初始化.
* @param filterConfig servlet filter config
* @throws ServletException sevlet exception when error
*/
public void init(FilterConfig filterConfig) throws ServletException {
this.config = filterConfig;
this.afterSetFilterConfig();
}
/**
* destroy.
*/
public void destroy() {
// nothing to do
}
}
2.web.xml配置
<!-- 强制修改密码的过滤器-->
<filter>
<filter-name>RemindChangePasswordFilter</filter-name>
<filter-class>com.huaxia.auth.utils.RemindChangePasswordFilter</filter-class>
<init-param>
<param-name>loginPages</param-name>
<param-value>login.jsp;Login.do;Logout.do;DisplayForced2ChangePWAction.do;Forced2ChangePWAction.do</param-value>
</init-param>
<init-param>
<param-name>forcedToChangePassword</param-name>
<param-value>FORCED_TO_CHANGE_PASSWORD</param-value>
</init-param>
<init-param>
<param-name>redirectPath</param-name>
<param-value>DisplayForced2ChangePWAction.do</param-value>
</init-param>
<init-param>
<param-name>disabletestfilter</param-name>
<param-value>N</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>RemindChangePasswordFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>RemindChangePasswordFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>RemindChangePasswordFilter</filter-name>
<url-pattern>/</url-pattern>
</filter-mapping>