来段代码提提神-那些无法回避的知识点之过滤器Filter

时间:2021-04-23 18:27:25

吃饭回来,发现今天第一天上班却累的不行,已经立志减肥;


来段代码提提神--过滤器,貌似是不该也无法回避的知识点。他的存在使得我们的工作可以按我想要的结果运行。学习他,即使很少情况下我们会用到。


Java的项目的启动文件web.xml文件有很多标签大家可以学习一下:推荐问题(Filter、Servlet、Listener区别与联系

第一步:配置在web.xml文件

<filter>
<description>登录的过滤器配置</description>
<filter-name>appFilter</filter-name>
<filter-class>com.san.console.filter.ApplicationFilter</filter-class>
<init-param>
<param-name>loginUrl</param-name>
<param-value>/login.jsp</param-value>
</init-param>
</filter>


第二部:写过滤器代码

import java.io.IOException;
import java.io.PrintWriter;

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.HttpSession;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import com.sand.o2oconsole.utils.WebConstant;

public class ApplicationFilter implements Filter {

// 日志记录器
public final Logger log = Logger.getLogger(this.getClass());

String loginUrl = "";

/**
* 20141127
* @author yuanyirui
* : 在方法后调用一个方法 ,比如动态代理就是拦截器的简单实现,过滤器是在java
* web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的
* action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者
* struts的action前统一设置字符集,或者去除掉一些非法字符。
* */
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
HttpSession httpSession = httpRequest.getSession();

Object sessionObject = httpSession
.getAttribute(WebConstant.SESSION_EMPLOYEE_BEAN);

// 获得请求地址
StringBuffer requestUrl = httpRequest.getRequestURL();
// 截取字符串 生成登录的地址
String url = requestUrl.toString();
if (httpSession != null && sessionObject != null) {// 如果session不为空,认定是登陆过来的
chain.doFilter(httpRequest, httpResponse);
} else if (StringUtils.containsIgnoreCase(url, "login.action")) { // url是login.action过来的,认定是登陆
chain.doFilter(httpRequest, httpResponse);
} else if (httpRequest.getHeader("x-requested-with") != null
&& httpRequest.getHeader("x-requested-with").equalsIgnoreCase(
"XMLHttpRequest")
&& !StringUtils.containsIgnoreCase(url, "_login")) {
PrintWriter printWriter = response.getWriter();
printWriter.print("{sessionState:0}");
printWriter.flush();
printWriter.close();
} else if (httpSession == null || sessionObject == null) {//session 为空的时候,跳转到登陆的状态
httpResponse.sendRedirect(httpRequest.getContextPath() + loginUrl);//
}
}

public void init(FilterConfig config) throws ServletException {
loginUrl = config.getInitParameter("loginUrl");
}

public void destroy() {
}

}


代码的时间已经相当久远了。那个啥,基本可以拿来就用;