java filter 登陆_JavaWeb Filter 实现登录注册过滤

0.环境准备

本文基于下文,使用 IDEA 调试:

1.项目修改

修改 login.jsp,使其能传递注册消息

οnblur="if (this.value == '') {this.value = '用户名';}">

οnblur="if (this.value == '') {this.value = 'Password';}">

修改 login servlet, 使其能接收注册消息

先判断注册消息

再验证登录信息

成功登录后通过 session 将登录状态改为 true

验证失败发送提示消息,并跳转回 login.jsp 页面

protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

// 设置编码格式,可以防止乱码出现

response.setContentType("text/html; charset=utf-8");

response.setCharacterEncoding("utf-8");

request.setCharacterEncoding("utf-8");

// 获取用户提交过来的用户名和密码,是通过表单中input的name属性获取的

String username = request.getParameter("username");

String password = request.getParameter("password");

String isSignUp = request.getParameter("isSignUp");

PrintWriter out = response.getWriter();

System.out.println(username + ": " + password + " isSignUp: " + isSignUp);

// 获取输出流,用户显示信息,也可以用转发或者重定向

PrintWriter pw = response.getWriter();

//注册验证

if ("注册".equals(isSignUp)) {

try {

JdbcOp jdbc = new JdbcOp();

jdbc.open("usersdb");

ResultSet rs = jdbc.executeQuery("select * from users");

while (rs.next()) {

String nm = rs.getString("name");

String pd = rs.getString("password");

System.out.println("username: " + nm + " password: " + pd);

if (nm.equals(username)) {

out.print("");

out.flush();

out.close();

}

}

//进行注册操作

int i = jdbc.executeUpdate("insert into users values('" + username + "','" + password + "')");

System.out.println(i);

if (i == 0) {

out.print("");

out.flush();

out.close();

} else {

out.print("");

out.flush();

out.close();

}

jdbc.close();

} catch (Exception e) {

e.printStackTrace();

}

} else {

//登录验证

try {

JdbcOp jdbc = new JdbcOp();

jdbc.open("usersdb");

ResultSet rs = jdbc.executeQuery("select * from users");

while (rs.next()) {

String nm = rs.getString("name");

String pd = rs.getString("password");

System.out.println("username: " + nm + " password: " + pd);

if (nm.equals(username) && pd.equals(password)) {

HttpSession session = request.getSession();

//将数据存储到session中

session.setAttribute("isLogin", "true");

session.setAttribute("username", username);

out.print("");

out.flush();

out.close();

}

}

jdbc.close();

} catch (Exception e) {

e.printStackTrace();

}

pw.write("login fail");

out.print("");

out.flush();

out.close();

}

}

3.创建 login filter 文件

过滤前先判断是否是需要放行的页面

然后判断登录状态,true 放行,false 强制跳转到 login.jsp

package login;

import javax.servlet.*;

import javax.servlet.annotation.WebFilter;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import java.io.IOException;

import java.io.PrintWriter;

import java.net.URLEncoder;

@WebFilter(filterName = "LoginFilter", urlPatterns = "/*")

public class LoginFilter implements Filter {

/**

* 需要排除的页面

*/

private String excludedPages;

private String[] excludedPageArray = {"/index.jsp", "/login.jsp", "/login"};

public void destroy() {

}

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {

HttpServletRequest request = (HttpServletRequest) req;

HttpServletResponse response = (HttpServletResponse) resp;

response.setCharacterEncoding("UTF-8");

response.setContentType("text/html;charset=UTF-8");

//使用request对象的getSession()获取session,如果session不存在则创建一个

HttpSession session = request.getSession();

//获取session的Id

String sessionId = session.getId();

//判断session是不是新创建的

if (session.isNew()) {

//将数据存储到session中

session.setAttribute("isLogin", "false");

response.getWriter().print("session generate successfully, the ID of session: " + sessionId);

} else {

response.getWriter().print("sever has existed the session, the ID of session: " + sessionId);

}

Object loginFlag = session.getAttribute("isLogin"); //("isLogin");

response.getWriter().print(" session.isLogin: " + loginFlag);

boolean isExcludedPage = false;

response.getWriter().print(" current.url=" + request.getServletPath()+" current.user="+session.getAttribute("username"));

for (

String page : excludedPageArray) {// 判断是否在过滤 url 之外

if (request.getServletPath().equals(page)) {

isExcludedPage = true;

break;

}

}

if (isExcludedPage) {// 在过滤 url 之外

chain.doFilter(request, response);

} else {

if (loginFlag == "false") {

//没有登录

PrintWriter out = response.getWriter();

out.print("");

out.flush();

out.close();

}

chain.doFilter(request, response);

}

}

public void init(FilterConfig config) throws ServletException {

}

}

4.调试

开启 filter 后,访问其他页面会被阻止并返回登录:

1a8e3ec49d6ecd62c1ca15ff34058629.png

b331342c2ab87f3331b2d73076f37494.png

成功登录:

cff1eed769a93786880e4df5c034b7f5.png

ec0024dbf1e587cc0140fd9cdeb875e9.png

登录验证失败:

c0ca98eff629f08b9fea3a63386a138e.png

c21c2caf5781f874010e88125413687f.png

注册判断用户名是否被占用:

af0f4be699a2ac01ec2003e2d3319c39.png

88a6b6b97d585df1bf3f3578d6a6c0c9.png

成功注册:

1e926f58ae3992e06b422e0cfbb57628.png

19c4187a706ac26ddf1c90b954ecfe4b.png

5.附

完整项目及其他相关资源下载:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值