标题:过滤器详细讲解及代码 描述:本文深入解析了过滤器的概念、作用以及在Java Web开发中的应用,特别聚焦于如何使用过滤器进行身份验证和页面跳转控制。通过具体的代码示例,帮助读者理解过滤器的工作原理,并提供实际操作的指导。 ### 过滤器概念与工作原理 过滤器(Filter)是Java Web开发中的一种设计模式,用于对用户请求和服务器响应进行预处理或后处理。它可以检查和修改HTTP请求或响应,从而实现诸如权限验证、编码转换、日志记录等功能。过滤器是通过`javax.servlet.Filter`接口定义的,它提供了三个主要的方法: - `init(FilterConfig config)`:初始化方法,在容器加载过滤器时调用。 - `doFilter(ServletRequest request, ServletResponse response, FilterChain chain)`:核心处理方法,每次有请求经过该过滤器时都会调用此方法。 - `destroy()`:销毁方法,在容器卸载过滤器时调用。 ### 实现一个简单的过滤器 以下是一个简单的过滤器实现示例,用于检查用户是否登录,如果未登录,则重定向到登录页面。 #### 过滤逻辑 代码片段展示了过滤器如何检查用户是否已经登录,如果没有登录,将重定向到特定的Servlet进行处理,否则允许请求继续传递到目标资源。 ```java if(uriStr.indexOf("login.jsp")==-1&&uriStr.indexOf("empservlet")==-1&&uriStr.indexOf("images")==-1&& rq.getSession().getAttribute("user")==null){ rp.sendRedirect("empservlet"); }else{ filterChain.doFilter(request,response); } ``` 在这个例子中,过滤器检查请求的URI是否指向`login.jsp`、`empservlet`或`images`目录之外的资源,并且会话中没有名为`user`的属性(通常表示当前用户)。如果这些条件都满足,那么请求将被重定向到`empservlet`进行进一步处理,否则请求将继续通过`filterChain.doFilter(request,response)`传递到下一个过滤器或最终的目标资源。 #### 初始化和编码设置 过滤器的初始化方法`init(FilterConfig config)`允许设置一些初始参数,如编码方式。在示例代码中,`targetEncoding`变量被用来存储从`FilterConfig`对象获取的编码参数,这在后续处理中用于设置请求和响应的字符编码。 ```java public void init(FilterConfig config) throws ServletException { this.filterConfig = config; this.targetEncoding = config.getInitParameter("encoding"); } ``` ### 使用过滤器进行页面跳转和权限验证 过滤器可以有效地控制对Web应用程序资源的访问,例如,仅允许已登录的用户访问某些页面。在`doFilter`方法中,通过检查`session`中的`isLogin`属性,可以判断用户是否已经登录,从而决定是否允许用户访问请求的资源。 ```java isLogin = (String) session.getAttribute("isLogin"); if ((isLogin != null) && isLogin.equals("true")) { chain.doFilter(request, response); } else { // 如果未登录,则重定向到登录页面 } ``` ### 结论 过滤器是Java Web开发中一个强大的工具,可以用来实现各种功能,包括但不限于权限验证、编码转换、日志记录等。通过理解和掌握过滤器的使用,开发者可以构建更安全、更高效的应用程序。上述代码示例展示了如何利用过滤器进行基本的身份验证和页面跳转控制,为学习和实践Java Web开发中的过滤器技术提供了有益的参考。
<img border=0 width=579 height=52 src="main.files/image001.gif" alt=欢迎来到家庭财务管理系统 v:shapes="_x0000_s1025">和链接<a href="regist.jsp">也给过滤了,都不管了。
filter内容该如何写呢?
过滤器里这样写:
HttpServletRequest rq=(HttpServletRequest)request;
HttpServletResponse rp=(HttpServletResponse)response;
String uriStr =rq.getRequestURI();
if (uriStr.indexOf("login.jsp") == -1 && uriStr.indexOf("empservlet")==-1&&uriStr.indexOf("images")==-1&&
rq.getSession().getAttribute("user") == null){
rp.sendRedirect("empservlet");
}else{
filterChain.doFilter(request, response);
}
login.jsp是登陆页面
images是存放图片文件夹
empservlet是登陆页面要转到的验证登陆用户的servlet
user是存放登陆用户的session
我这也是朋友教的```登陆页面跟登陆页面的图片都不会给过滤掉了``
下面是不从首页登陆就返回index.jsp的过滤器,web.xml里配置一下就能用了
import javax.servlet.*;
import java.io.*;
import javax.servlet.http.*;
//登陆过滤器
public class ViewCheckFilter implements Filter {
protected FilterConfig filterConfig;
final private String CONTENT_TYPE_HTML = "text/html; charset=gb2312";
PrintWriter toClientTextOutStream;
/**
* 初始化过滤器,和一般的Servlet一样,它也可以获得初始参数。
*/
public void init(FilterConfig config) throws ServletException {
this.filterConfig = config;
this.targetEncoding = config.getInitParameter("encoding");
}
//过滤处理的方法
public void doFilter(final ServletRequest request,
final ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httprequest = (HttpServletRequest) request;
HttpServletResponse httpresponse = (HttpServletResponse) response;
HttpSession session = httprequest.getSession();
String isLogin = "";
httprequest.setCharacterEncoding(targetEncoding); //对客户端的请求进行统一的编码
response.setContentType(CONTENT_TYPE_HTML);
toClientTextOutStream = new PrintWriter(response.getOutputStream());
try { //获得在session中所记录的isLogin属性,该属性由登录部分的代码写入
isLogin = (String) session.getAttribute("isLogin");
if ((isLogin != null) && isLogin.equals("true")) //验证成功,继续处理
{
chain.doFilter(request, response);
} else //验证不成功,让用户登录。
{
toClientTextOutStream.print("<script language=\"JavaScript\">");
toClientTextOutStream.print("alert(\"您未登录,因此不具有权限\");");
剩余7页未读,继续阅读
- 粉丝: 16
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助