大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要介绍Java web如何实现账号单一登录以及防止同一账号重复登录的效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
创新互联建站坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站设计、成都网站制作、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的东山网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
下面进入主题
其中:jquery-1.11.3.js是网上的工具
建立两个简单的界面
登录界面:为了简单没有设置密码,直接输入账号点击登录就行
// index.jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>" rel="external nofollow" rel="external nofollow" > My JSP 'index.jsp' starting page
主页面:简单的一个提交按钮
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>" rel="external nofollow" rel="external nofollow" > My JSP 'SingleCount.jsp' starting page 已登录.
写ajax,向后台提交请求
// jsSubmit.js
$(document).ready(function() { // 登录按钮 $("#btnlogin").click(function() { //data,dataType,type,url $.ajax({ url: 'LoginServlet?method=login', type: 'post', data: {username: $("input[name='username']").val()}, // 将用户名传给servlet //dataType:'json', success: function(msg) { // msg为从servlet接收到的返回值 if (msg == 1) { // 接收到后台数据为1,正常登录 window.location.href = "singlecount.jsp"; } }, error:function(){ window.alert("错误!"); } }); }); // 提交按钮 $("#btnsubmit").click(function() { //data,dataType,type,url $.ajax({ url: 'SubmitServlet?method=submit', type: 'post', //dataType:'json', success: function(msg) { // msg为从servlet接收到的返回值 if (msg >= 1) { // 正常 window.alert("提交总数" + msg); } }, error:function(jqXHR){ if(jqXHR.status == 900){ // 900状态码 window.alert("登录状态失效,请重新登录!"); window.location.href = "/OneLogin"; } } }); }); });
servlet
这部分有点长,其实主要内容直接看doPost方法就可以了。
// LoginServlet package servlet; import java.io.IOException; import java.io.PrintWriter; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @SuppressWarnings("serial") //注解表明什么样的情况下可以访问该内容 @WebServlet(urlPatterns={"/LoginServlet"}) public class LoginServlet extends HttpServlet { private PrintWriter out; // 输出流 private String user; private String method; private HttpSession session; // 建立一个Map存储session信息,key-用户名,value-session public static Mapuser_Session = new HashMap (); @Override public void init(ServletConfig config) throws ServletException { // TODO Auto-generated method stub super.init(config); } @Override protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub super.doDelete(req, resp); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub doPost(req, resp); } @Override // 在这里实现方法 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub resp.setContentType("text/html"); //语言编码 req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); out = resp.getWriter(); user = req.getParameter("username"); // 获取index界面username的内容 method = req.getParameter("method"); // 获取方法名 session = req.getSession(); // 获取session switch (method) { case "login": mLogin(); break; default: break; } out.flush(); out.close(); } private void mLogin() { // 按登录按钮调用的方法 // TODO Auto-generated method stub removeUser(user); session.setAttribute("name", user); user_Session.put(user, session); // 新增或覆盖session System.out.println(user_Session); out.println(1); // 返回值1,随意选个值,和前端对应就可以 } /** * 判断是否有重复用户, * 若出现重复用户,踢掉前面登录的用户,即删除其session */ private void removeUser(String user) { if(user_Session.containsKey(user)) user_Session.get(user).invalidate(); } } // SubmitServlet package servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @SuppressWarnings("serial") //注解表明什么样的情况下可以访问该内容 会在js和web.xml中使用 @WebServlet(urlPatterns={"/SubmitServlet"}) public class SubmitServlet extends HttpServlet { private PrintWriter out; // 输出流 private String method; private int number = 0; // 计数 @Override public void init(ServletConfig config) throws ServletException { // TODO Auto-generated method stub super.init(config); } @Override protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub super.doDelete(req, resp); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub doPost(req, resp); } @Override // 在这里实现方法 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub resp.setContentType("text/html"); //语言编码 req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); out = resp.getWriter(); method = req.getParameter("method"); // 获取方法名 switch (method) { case "submit": mSubmit(); break; default: break; } out.flush(); out.close(); } private void mSubmit() { // 按提交按钮调用的方法 // TODO Auto-generated method stub number++; out.println(number); } }
过滤器
过滤器的原理这里就不说了,简单来说就是请求要先经过过滤器才能到达servlet,也就是说如果请求不满足要求就无法通过过滤器,这里的要求是要有session。
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.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebFilter("/SessionFilter") public class SessionFilter implements Filter { @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { // TODO Auto-generated method stub HttpServletRequest request = (HttpServletRequest) arg0; HttpServletResponse response = (HttpServletResponse) arg1; String strURL = request.getRequestURL().toString(); // 获取请求路径 // System.out.println(strURL); // 只过滤来自SubmitServlet请求和singlecount.jsp的加载,可以设置成自己想过滤的 // 需要在web.xml中添加if(strURL.indexOf("SubmitServlet") != -1 || strURL.indexOf("singlecount.jsp") != -1){ if(request.getSession().getAttribute("name") == null){ request.getSession().invalidate(); response.sendError(900, "登录失效,请重新登录!"); // 自定义状态码,session失效 // 900 到ajax的error中处理 return; } else { arg2.doFilter(arg0, arg1); } } else { arg2.doFilter(arg0, arg1); } } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } }
配置web.xml
OneLogin index.html index.htm index.jsp default.html default.htm default.jsp filter.SessionFilter filter.SessionFilter filter.SessionFilter /singlecount.jsp filter.SessionFilter /SubmitServlet
实现效果
可以使用两个不同的浏览器当两个客户端,或者电脑多就用多台电脑。
相同账号登录时,前面账号再点提交请求就会给出提示,跳转到登录界面
未登录直接进入:http://localhost:8080/OneLogin/singlecount.jsp
如果也想实现跳转效果,在jsSubmit.js的$(document).ready(function() {…});
前面加入是否有session的判断,没有就给出提示,跳转到登录界面。
以上是“Java web如何实现账号单一登录以及防止同一账号重复登录的效果”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注创新互联行业资讯频道!