今天学习了一点java 的Filter过滤器,实现了非法用户访问问题。
写一点心得吧。
Filter是一个过滤器,所谓过滤器嘛,就是我们熟知的筛子,将我们要的东西留下来,然后对筛到的东西进行一下操作,然后在放走。filter就是类似一个功能。
Filter的作用是用于过滤、拦截请求或响应消息,可以在Servlet或JSP页面运行之前和之后被自动调用。
废话不多说,还是用代码说话:
package com.shopping.filter;
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.HttpSession;
public class UserCheckFilter implements Filter {
private FilterConfig filterConfig;
//登录页面,当用户没有登录是,将会首先转到这个页面
private String loginPage = "adminLogin.jsp";
public UserCheckFilter() {
// TODO Auto-generated constructor stub
}
public void destroy() {
// TODO Auto-generated method stub
filterConfig = null;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
//获得请求页面
String uri = req.getRequestURI();
//通过判断session中是否具有adminuser菜蔬来判断用户是否已经登录
HttpSession session = req.getSession(true);
//如果访问登录页面或已经登录
if(uri.endsWith(loginPage) || uri.endsWith("adminLoginServlet") || session.getAttribute("adminuser") !=null){
chain.doFilter(req, res);
return;
}
//尚未登录,得发访问
else{
//跳转到登录页面
res.sendRedirect(loginPage);
}
// pass the request along the filter chain
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
//通过FilterConfig获得web.xml中设置的舒适化参数
filterConfig = fConfig;
if(filterConfig.getInitParameter("loginPage") != null){
loginPage = filterConfig.getInitParameter("loginPage");
}
}
}
web.xml中是这样的:
<filter>
<display-name>UserCheckFilter</display-name>
<filter-name>UserCheckFilter</filter-name>
<filter-class>com.shopping.filter.UserCheckFilter</filter-class>
<init-param>
<param-name>loginPage</param-name>
<param-value>adminLogin.jsp</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>UserCheckFilter</filter-name>
<url-pattern>/UserCheckFilter</url-pattern>
</filter-mapping>
web.xml文件是对Filter的注册;
来看一下源码:
destroy方法、doFilter方法、init方法三个必备的方法,方法不多说,见文知意。
来看init方法的参数FilterConfig fConfig,FilterConfig是可以从web.xml文件中读出Filter配置时定义的一些参数变量<init-param></init-param>中的
再看看HttpServletRequest和HttpServletResponse,其实HttpServletRequest和HttpServletResponse其实是实现了ServletRequest和ServletResponse接口的。只不过他其中多了一些关于http的定义。
然后在看看url和uri吧,这个东西挺让人纠结的,到底什么是uri啊,好像只听说过url。
其实url是uri的一种标识方法,uri(Uniform Resource Identifier)通用资源标识符,url是uri的一种。
一般情况下,url使用的是绝对地址,uri就可以是相对的,也可以是绝对的。
有一点大家一定有注意,当我们在项目中创建了过滤器或监听器,但是我们不想用了,就把它的.java文件删除掉了,如果是这样的话,那么当我们重新加载项目的时候就会报错,这是因为在我们加载项目的时候,服务器会自动的加载web.xml文件中配置,而且是顺序加载,所以当遇到我们配置了但是已经无源文件,那么当然会报错。
解决办法,当我们删除一个监听或者是一个过滤器时,一定要将web.xml文件的配置和.java文件一起删除掉。
个人心得,如有错误请留言,大家一起交流学习。