Servlet中过滤器的登录验证,编码设置
Servlet中过滤器的登录验证,编码设置
一.过滤器解析
A.通俗解析:过滤器相当于阿姨叔叔。当外人要进去的时候,先得通过他的检查,如果合理,就让你进去,否则,就进不去啦。过滤器负责的是担保工作。
B.正式解析:Filter是在Servlet 2.3之后增加的新功能,当需要限制用户访问某些资源或者在处理请求时提前处理某些资源的时候,就可以使用过滤器完成。
过滤器是以一种组件的形式绑定到WEB应用程序当中的,与其他的WEB应用程序组件不同的是,过滤器是采用了“链”的方式进行处理的。
图解:
API解析:
实现过滤器
在Servlet中,如果要定义一个过滤器,则直接让一个类实现javax.servlet.Filter接口即可,此接口定义了三个操作方法:
· public void init(FilterConfig filterConfig) throwsServletException
· public void doFilter(ServletRequestrequest,ServletResponse response,FilterChain chain) throwsIOException,ServletException
· public void destroy()
FilterChain接口的主要作用是将用户的请求向下传递给其他的过滤器或者是Servlet:
· public void doFilter(ServletRequestrequest,ServletResponse response) throws IOException,ServletException
在FilterChain接口中依然定义了一个同样的doFilter()方法,这是因为在一个过滤器后面可能存在着另外一个过滤器,也可能是请求的最终目标(Servlet),这样就通过FilterChain形成了一个“过滤链”的操作。
在进行WEB开发中,编码过滤是必不可少的操作,如果按照之前的做法,在每一个JSP或者是Servlet中都重复编写“request.setCharacterEncoding("UTF-8")”的语句肯定是不可取的,会造成大量的代码重复,那么此时就可以通过过滤器完成这种编码过滤。
二.完整项目截图:
三.源代码(编写代码时就按这个顺序):
1.login.jsp(直接复制一份index.jsp,然后进行编写)
<%@ page language="java" import="java.util.*"pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01Transitional//EN">
<html>
<head>
<title>用户登录</title>
</head>
<body style="text-align: center;">
<h1>用户登录</h1>
<formaction="login?method=login" method="post">
<span>用户名:</span><inputtype="text" name="username"><br>
<br><span>密 码:</span><inputtype="password" name="password"><br>
<br> <inputtype="submit" value="登录">
</form>
</body>
</html>
2.success.jsp
<%@ page language="java" import="java.util.*"pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01Transitional//EN">
<html>
<head>
<title>登录成功!</title>
</head>
<body>
欢迎你${username },你的密码是:${password }
</body>
</html>
3.ServletLogin.java
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletLogin extends HttpServlet {
private static final longserialVersionUID = 1L;
HttpServletRequest request;
HttpServletResponseresponse;
@Override
protected voiddoPost(HttpServletRequest request,
HttpServletResponseresponse) throws ServletException, IOException {
// 获取到的方法
String method =request.getParameter("method");
System.out.println(method);
this.request =request;
this.response =response;
try {
if("login".equals(method)) {
login();
//转发
request.getRequestDispatcher("/success.jsp").forward(request,response);
}else {
PrintWriterout=response.getWriter();
out.print("网页不知去哪里了");
out.close();
}
} catch (Exceptione) {
e.printStackTrace();
}
}
@Override
protected voiddoGet(HttpServletRequest request,
HttpServletResponseresponse) throws ServletException, IOException {
doPost(request,response);
}
private void login() {
String username =request.getParameter("username");
String password =request.getParameter("password");
request.getSession().setAttribute("username",username);
request.setAttribute("password",password);
System.out.println(password);
}
}
4. filter.java
package 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 filter implements Filter {
private String encoding =null;
private String contentType= null;
private String passUrl ="";
@Override
public voidinit(FilterConfig config) throws ServletException {
encoding =config.getInitParameter("encoding");
contentType =config.getInitParameter("contentType");
passUrl =config.getInitParameter("passUrl");
}
@Override
public voiddoFilter(ServletRequest req, ServletResponse res,
FilterChainchain) throws IOException, ServletException {
HttpServletRequestrequest = (HttpServletRequest) req;
HttpServletResponseresponse = (HttpServletResponse) res;
request.setCharacterEncoding(encoding);
response.setContentType(contentType);
String path =request.getRequestURL().toString();
// 无需过滤的页面
String[] url =passUrl.split(";");
for (String str :url) {
if(path.indexOf(str) > -1) {
chain.doFilter(request,response);
return;
}
}
// 登录页面无需过滤(这个其实上边已经包含了)
if(path.indexOf("login.jsp") > -1) {
chain.doFilter(request,response);
return;
}
// 需要过滤的页面
String username =(String) request.getSession()
.getAttribute("username");
if (username !=null) {
if(username.trim() != "") {
chain.doFilter(request,response);
} else {
response.sendRedirect(request.getContextPath()+ "/login.jsp");
}
} else {
response.sendRedirect(request.getContextPath()+ "/login.jsp");
}
}
@Override
public void destroy() {
}
}
5.web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID"version="2.5">
<display-name>ServletFilter</display-name>
<servlet>
<description></description>
<servlet-name>ServletLogin</servlet-name>
<servlet-class>servlet.ServletLogin</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletLogin</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<filter>
<filter-name>filter</filter-name>
<filter-class>filter.filter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>contentType</param-name>
<param-value>text/htmt;charset=UTF-8</param-value>
</init-param>
<init-param>
<param-name>passUrl</param-name>
<param-value>index.jsp;login.jsp;/login;</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
四.总结:
过滤器是一种自动执行的servlet,过滤器会在一个url正要执行的时候触发,只有通过chain.doFilter(request,response),url才会正常执行,否则,则被拦截。
以上程序中,如果输入包含login.jsp的页面,则直接通过,它被定义为不进行拦截的页面,但是但是它也参与了拦截,只是没有其他的拦截要求。直接输入success.jsp,就会被判断是否存在用户名的session。
过滤器需要再web.xml中配置。
Web.xml中用到了两个值的注意的知识,
<url-pattern>/*</url-pattern>、<url-pattern>/</url-pattern>、<url-pattern>/.do</url-pattern>
下面对这三个进行解释:
1./* 会匹配所有的url:路径型的和后缀型的url(包括/springmvc,.jsp,.js和*.html等)
2./ 会匹配到/login这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url
3..do 只匹配以.do结尾的路径型url.
参考网址:http://www.cnblogs.com/lanxuezaipiao/archive/2012/08/05/2623547.html
参考网址:http://www.cnblogs.com/oumyye/p/4273330.html
本文由安康学院“雨季”原创!