过滤器
为什么需要过滤器?
在web项目中,有的时候我们不想未登录的用户或者外界没有权限者访问某一些jsp,这个时候就需要filter
了
FirstFilter
当访问index.jsp
和main.jsp
的时候需要做一些处理.
配置web.xml:
<!-- 定义FirstFilter过滤器标签 -->
<filter>
<filter-name>FirstFilter</filter-name>
<filter-class>com.filter.FirstFilter</filter-class>
</filter>
<!-- filtermapping映射标签 -->
<filter-mapping>
<filter-name>FirstFilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>FirstFilter</filter-name>
<url-pattern>/main.jsp</url-pattern>
</filter-mapping>
com.filter.FirstFilter类:
/*
* filter函数,实现了javax.servlet.Filter这个接口
* */
package com.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;
public class FirstFilter implements Filter {
public void destroy() {
//当服务器关闭的时候执行
System.out.println("FirstFilter--destroy()函数执行。。。");
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
System.out.println("FirstFilter--开始。。。");
//执行doFilter()操作,arg2,是FilterChain对象,arg1,arg2分别是request和respons对象
HttpServletResponse response = (HttpServletResponse)arg1;
HttpServletRequest request = (HttpServletRequest)arg0;
response.sendRedirect(request.getContextPath()+"/main.jsp");
//request.getRequestDispatcher(request.getContextPath()+"/main.jsp").forward(request, response);
System.out.println("FirstFilter--结束。。。");
arg2.doFilter(arg0, arg1);//该方法执行完后才执行下面的打印语句
System.out.println("FirstFilter-doFilter()...");
}
public void init(FilterConfig arg0) throws ServletException {
//服务器启动时候执行
System.out.println("FirstFilter--init()函数执行。。。");
}
}
html界面:
--------------------main.jsp-------------------
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
System.out.println("this is main.jps... ");
%>
<body>
<h1>This is main JSP page.</h1> <br>
</body>
----------------------index.jsp---------------------
<body>
”This is my JSP page. <br>
</body>
测试:
访问index.jsp
,观察控制台输出:
FirstFilter--开始。。。
this is main.jps...
FirstFilter--结束。。。
this is index.jps...
FirstFilter-doFilter()...
用户登录后台过滤
当用户登录成功时,可以任意访问success.jsp
时候,当用户没登陆时,无法访问success.jsp
html界面:
-----------------------login.jsp---------------------------------
<body>
<h1>用户登录</h1> <hr>
<form action="servlet/LogServlet" name="LogIn" method="post">
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="username" value=""></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="userpass" value=""></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" name="submit" value="登录"></td>
</tr>
</table>
</form>
</body>
-----------------------success.jsp---------------------------------
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
System.out.println("this is Success.jps... ");
%>
<body>
<h1>登录成功,欢迎使用!</h1> <br>
用户:<%=request.getSession().getAttribute("name") %>
</body>
-----------------------failure.jsp---------------------------------
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
System.out.println("this is failure.jps... ");
%>
<body>
<h1>登录失败,请检查用户名或密码!</h1> <br>
</body>
```
servlet-- LogDo:
```java
package com.filter;
import java.io.IOException;
import javax.jms.Session;
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.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LogDo implements Filter {
private FilterConfig config;
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)arg0;
HttpServletResponse response = (HttpServletResponse)arg1;
//如果request.getUri中有login.jsp,则执行dofilter()放行,不过滤
// if(request.getRequestURI().indexOf("login.jsp")!=-1){
// arg2.doFilter(arg0, arg1);
// return;
// }
//使用init函数中的FilterConfig对象来检查是否包含要过滤的地址,如果包含就过滤
String noLoginPaths = config.getInitParameter("noLoginPaths");
if (noLoginPaths!=null) {
String[] arr = noLoginPaths.split(";");
for(String s:arr){
if (request.getRequestURI().indexOf(s)!=-1) {
arg2.doFilter(arg0, arg1);//放行
return;
}
}
}
//在LogServlet中setAttribute中设置了name值,表示是正常登陆成功的
if(request.getSession().getAttribute("name")!=null){
arg2.doFilter(arg0, arg1);
//return;//直接return表示终止代码继续运行
}else {
response.sendRedirect("login.jsp");
}
}
public void init(FilterConfig arg0) throws ServletException {
config = arg0;
}
}
<div class="se-preview-section-delimiter"></div>
web.xml:
<servlet-mapping>
<servlet-name>AsyncServlet</servlet-name>
<url-pattern>/servlet/AsyncServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>LogServlet</servlet-name>
<url-pattern>/servlet/LogServlet</url-pattern>
</servlet-mapping>
<!-- *************过滤登录成功和失败界面****************** -->
<filter>
<filter-name>LogDo</filter-name>
<filter-class>com.filter.LogDo</filter-class>
<init-param>
<param-name>noLoginPaths</param-name>
<param-value>login.jsp;LoginServlet</param-value>
</init-param>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<div class="se-preview-section-delimiter"></div>
测试:
当用户未登录时,访问success.jsp
:
输出错误信息。。。
this is error.jps...
<div class="se-preview-section-delimiter"></div>
当用户登录成功后,访问success.jsp
:
this is Login.jps...
user detaile:admin 123
this is Success.jps...