通过过滤器实现完整的网页登录过程
框架
只有拿到门票的用户才能登录成功,注销时没收门票
Filter
作用:
处理中文乱码
登录验证….
加在服务器和servlet之间,用于过滤请求和响应;
导包
具体代码
登录页面index.jsp
<html>
<body>
<h2>登录页面</h2>
<div style="text-align:center">
<%--${pageContext.request.contextPath}表示当前项目web路径--%>
<%--method="post"设置请求方式--%>
<form action="${pageContext.request.contextPath}/login" method="post">
<%@ page pageEncoding="utf-8"%>
用户名:<input type="text" name="username"> <br>
密码:<input type="password" name="password"><br>
<input type="submit">
</form>
</div>
</body>
</html>
error.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>错误</title>
</head>
<body>
<h2>用户名不存在或密码错误!</h2>
<a href="/s1/index.jsp">返回登录页面</a>
</body>
</html>
success.jsp
success.jsp放在web/sys/
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>某页面</title>
</head>
<body>
<h1>主页</h1>
<h2 登录成功 style="text-align:center"></h2>
<%--设置按钮--%>
<a href="../logout">注销账户</a>
</body>
</html>
登录Servlet Login
package com.tl.login;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author tl
* 实现页面登录功能:只有输入正确密码才能登录成功并拿到门票,
* 否则重定向到error.jsp页面
*/
public class Login extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username=req.getParameter("username");
String password=req.getParameter("password");
if(username.equals("admin")&&password.equals("123456")){
req.getSession().setAttribute(Constant.name,req.getSession().getId());
resp.sendRedirect("/s1/sys/success.jsp");
}
else {
resp.sendRedirect("/s1/error.jsp");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
过滤器LoginFilter
package com.tl.login;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author tl
* 过滤器 过滤没有拿到门票的请求,响应它们到登录页面
*/
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest) request;
HttpServletResponse resp=(HttpServletResponse) response;
if(req.getSession().getAttribute(Constant.name)==null){
resp.sendRedirect("/s1/index.jsp");
}
//通行
chain.doFilter(request,response);
}
@Override
public void destroy() {
}
}
注销 Logout
package com.tl.login;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author tl
* 登录页面后可以注销登录 注销时调用该类
* 将该用户的门票没收
*/
public class Logout extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
if(req.getSession().getAttribute(Constant.name)!=null){
//没收门票
req.getSession().removeAttribute(Constant.name);
resp.sendRedirect("/s1/index.jsp");
}
else{
resp.sendRedirect("/s1/index.jsp");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
常数类 Constant
package com.tl.login;
/**
* @author tl
* 在这里定义常数
*/
public class Constant {
static String name="USER_NAME";
}
注册 web.xml
通过过滤器过滤/s1/sys/*网页的请求和响应
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
<servlet>
<servlet-name>Login</servlet-name>
<servlet-class>com.tl.login.Login</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Logout</servlet-name>
<servlet-class>com.tl.login.Logout</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Logout</servlet-name>
<url-pattern>/logout</url-pattern>
</servlet-mapping>
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.tl.login.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/sys/*</url-pattern>
</filter-mapping>
</web-app>