说明
登录拦截即是登录权限控制:进入首页、登录页以及登录servlet时,不用验证权限;进入其它页面时,须验证是否登录,未登录则跳转到登录页。
字符转化即是实现对中文乱码的解决,将字符转化成UTF-8。
效果展示
账号是“张三”,密码是“123456”。
在未登录成功之前,是不能在地址栏中输入其他文件路径进入的。
代码结构
源码
java
CheckLoginFilter.java
如果未登录成功则进行拦截。
package filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CheckLoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 将ServletRequest对象转换成HttpServletRequest对象
HttpServletRequest req = (HttpServletRequest) servletRequest;
// 将ServletResponse对象转换成HttpServletResponse对象
HttpServletResponse resp = (HttpServletResponse) servletResponse;
// 获取用户请求的URL
String uri = req.getRequestURI();
// 判断用户的请求没包含login.jsp页面并且session中的u值为空,则将flag标志设置为false,如果flag标志为false则跳转到登录页面,或者留给下一个Filter进行处理
// flag是登录成功标志
boolean flag = true;
// req.getSession().getAttribute("u") == null获取保存在session中的登录状态,如果为null表示未登录,否则表示已经登录
if (uri.indexOf("login") == -1 && req.getSession().getAttribute("u") == null) {
flag = false;
}
// 对登录登录标志进行判断
if (flag) {// 如果登录成功,则到下一个过滤器
filterChain.doFilter(req, resp);
} else {// 如果未登录,则跳转到登录页面进行登录
resp.sendRedirect("login.jsp");
}
}
@Override
public void destroy() {
}
}
EncodingFilter.java
将编码设置为UTF-8。
package filter;
import javax.servlet.*;
import java.io.IOException;
public class EncodingFilter implements Filter {
private String encoding = null;
private FilterConfig config;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.config = filterConfig;
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 判断的encoding是否为null
if (encoding == null) {
// 如果为null,则采用FilterConfig的config对象读取编码,encoding编码在配置文件web.xml中定义
encoding = config.getInitParameter("encoding");
}
if (encoding != null) {
// 通过request对象将编码设置为encoding的值
servletRequest.setCharacterEncoding(encoding);
// response对象设置页面的类型和字符编码
servletResponse.setContentType("text/html;charset=" + encoding);
}
// 将请求传到下一个过滤器处理
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
LoginServlet.java
处理登录,对登录状态进行判断及处理。
package servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取前端的用户名
String username = request.getParameter("username");
// 获取前端的密码
String password = request.getParameter("password");
// 对用户名和密码进行验证
if (username.equals("张三") && password.equals("123456")) {
// 将登录成功这个状态保存到session中
request.getSession().setAttribute("u", username);
// 验证登录成功则跳转到index.jsp主页
request.getRequestDispatcher("index.jsp").forward(request, response);
} else {
// 验证登录失败则跳转到login.jsp登录页面进行登录
request.getRequestDispatcher("login.jsp").forward(request, response);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
web
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<!--欢迎页面-->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!--登录Servlet-->
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/loginServlet</url-pattern>
</servlet-mapping>
<!--过滤器-->
<filter>
<filter-name>CheckLogin</filter-name>
<filter-class>filter.CheckLoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CheckLogin</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>filter.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
index.jsp
主页面。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>首页</title>
</head>
<body>
<%=(String)session.getAttribute("u")%>
</body>
</html>
login.jsp
登录页面。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<form action="loginServlet" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录">
<input type="reset" value="重置">
</form>
</body>
</html>
如果对完整源码感兴趣。
可搜索微信公众号【Java实例程序】或者扫描下方二维码关注公众号获取更多。
注意:在公众号后台回复【CSDN201910082111】可获取本节源码。