总述

前些天,无意之间想到这个问题,感觉挺实用,有必要整理一下。随手写了一个简单的mode,感觉并不算难。思路理顺其实挺简单的。
为实现用户不可同时登陆,只要想想现实中新浪,百度等,只要一处登陆就将另一处的给“挤”下去,就可以知道实现结果为何。然后再逆推之,即可形成较为清晰的思路。我们一起来探讨一下。
首先,我们得明白用户登录使用什么登陆的,即用户在线的原理。这只是将用户的对象存放在了session中而已,然后再frame中进行调用,其他特定页面也进行直接引用就行。那么实现“挤下来”的功能就是让新生成的session有效,让原来存放用户的session失效就行。到此,大体思路已经有了。那怎么实现呢?
想要知道怎么实现,就必须要明白session存放用户对象的过程了。在用户登录之后,我们可以得到用户的对象user,而存放到session中需要执行session.setAttribute(key,value); 我们将用户的userId或是其他的唯一标识存为key,将用户对象存为值。这样就能随时随地调用唯一用户了。user存放的问题解决了,那相同 登录 时session废除的问题呢?
这个其实也不难,我们可以更具session的特性一样,用map进行存贮,将用户的标识存为key,而将其所对应的session存为value,那么当重复用户登录时,只需要取出对应的session,将其invalidate就行了。
至此,实现思路已经明了,聒噪了这么久,大家都急不可耐地想看代码了吧?以下是代码:
前置准备,jsp界面
界面很简单,只是一个简单的登录界面
<form action ="<%=request.getContextPath()%>/UserWXPServlet" method = "post"> 用户名<input type = "text" name = "username"/><br/> 密码<input type = "text" name = "password"/><br/> <input type = "submit" value ="提交"/> </form>
成功后跳转页面
欢迎:${sessionScope.user.username}登陆!<br/>
我这没有写失败页面,大家可以自己写,失败页面也没什么好说的了
entity和登录的实现
user的javabean
private String username;
private String password;
public User() {
}
public User(String user, String password) {
super();
this.username = user;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
登录user的service实现方法,这里就不写dao和接口了,一切以简单为
public boolean dologin(User user){
Properties pro = new Properties();
InputStream is = UserWXPServlet.class.getClassLoader().getResourceAsStream("user_wxp.properties");
String password = null;
System.out.println(is+"--------->"+pro);
if(user==null){
return false;
}
try {
pro.load(is);
password = pro.getProperty(user.getUsername());
if(user.getPassword()!=null&&user.getPassword().equals(password)){
System.out.println("登陆成功");
return true;
}
} catch (IOException e) {
e.printStackTrace();
}finally{
if(is!=null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return false;
}
登录成功返回true,失败则返回false。
Servlet和相应的逻辑工具类
接下来的代码就到了真正操作用户的代码了
本人在这里定义了两个类,一个工具类,一个核心servlet处理类
在工具类中加入了一些公共的元素,如以下代码:
/**
* 每一个用户存放一个session。便于各种操作!!!
*/
public static Map<String, HttpSession> mapSession = new HashMap<String,HttpSession>();
用户退出的代码(必须飞废除session或是remove相应的用户对象):
[java] view plain copy
public static void userLogout(String username){
if(mapSession.get(username)!=null){
//得到需要退出的用户的session
HttpSession session = mapSession.get(username);
//在map<username,session>中移除该用户,记住想要退出该用户,必须将该session废除或是remove掉user
mapSession.remove(username);
//得到session的所属性合集
Enumeration e = session.getAttributeNames();
//删除所有属性
while(e.hasMoreElements()){
String sessionName = (String) e.nextElement();
session.removeAttribute(sessionName);
}
//废除该session
session.invalidate();
}
}
Servlet的代码如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
User user = new User(username, password);
UserService userService = new UserService();
HttpSession session = request.getSession();
if(userService.dologin(user)){
//登录成功之后将用户插入到session中
session.setAttribute("user", user);
if(cheackSession(username)){
//如果该session在此之前已经存在,则将该用户进行退出操作
DbUtil.userLogout(username);
}
//将新的session存放到map<username,session>中
DbUtil.mapSession.put(username, session);
//操作成功,跳转,此处最好为重定向,让别人知道登录成功了
request.getRequestDispatcher("login").forward(request, response);
return ;
}
//此处跳转到失败页面,如果读者有兴趣,可以自行添加
}
其中cheackSession(username) 的代码如下:
/**
* 检查是否已经含有此session
* @param username
* @return true:已经存在,该删! false:未存在
*/
private boolean cheackSession(String username){
HttpSession session = DbUtil.mapSession.get(username);
if(session!=null){
return true;
}
return false;
}
最后附上Servlet的xml配置
<servlet> <description> 用于测试 ,用户不可重复登录 </description> <display-name>UserWXPServlet</display-name> <servlet-name>UserWXPServlet</servlet-name> <servlet-class>com.fingard.rabbit.wxp_test.Servlet.UserWXPServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UserWXPServlet</servlet-name> <url-pattern>/UserWXPServlet</url-pattern> </servlet-mapping>
以上所述是小编给大家介绍的Java实现用户不可重复登录功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# java实现不能重复登录
# java实现用户登录功能
# Java CRM系统用户登录功能实现代码实例
# Java+mysql用户注册登录功能
# JavaWeb使用Cookie模拟实现自动登录功能(不需用户名和密码)
# JavaWeb实现用户登录注册功能实例代码(基于Servlet+JSP+JavaBean模式)
# Java struts2 validate用户登录校验功能实现
# JavaWeb实战之用Servlet+JDBC实现用户登录与注册
# Java实现多用户注册登录的幸运抽奖
# Java 实现模拟用户登录的示例代码
# Java实战之实现用户登录
# 该用户
# 用户登录
# 在此
# 我们可以
# 就行
# 然后再
# 跳转
# 小编
# 在这里
# 放在
# 大家都
# 就能
# 急不可耐
# 也没
# 我这
# 其他的
# 这个问题
# 将其
# 给大家
# 很简单
相关文章:
商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?
建站之星后台密码如何安全设置与找回?
建站主机CVM配置优化、SEO策略与性能提升指南
C#如何在一个XML文件中查找并替换文本内容
如何选择最佳自助建站系统?快速指南解析优劣
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
海南网站制作公司有哪些,海口网是哪家的?
建站主机类型有哪些?如何正确选型
制作网页的网站有哪些,电脑上怎么做网页?
沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?
建站之星备案是否影响网站上线时间?
制作门户网站的参考文献在哪,小说网站怎么建立?
常州企业建站如何选择最佳模板?
如何用已有域名快速搭建网站?
建站之星如何助力企业快速打造五合一网站?
北京制作网站的公司,北京铁路集团官方网站?
魔方云NAT建站如何实现端口转发?
网站制作报价单模板图片,小松挖机官方网站报价?
网站制作费用多少钱,一个网站的运营,需要哪些费用?
上海网站制作网站建设公司,建筑电工证网上查询系统入口?
定制建站哪家更专业可靠?推荐榜单揭晓
c++怎么用jemalloc c++替换默认内存分配器【性能】
如何在Windows 2008云服务器安全搭建网站?
网站图片在线制作软件,怎么在图片上做链接?
网站制作壁纸教程视频,电脑壁纸网站?
ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
公司网站的制作公司,企业网站制作基本流程有哪些?
天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?
制作公司内部网站有哪些,内网如何建网站?
建站之星安装后如何配置SEO及设计样式?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
如何在IIS服务器上快速部署高效网站?
如何选择建站程序?包含哪些必备功能与类型?
如何快速登录WAP自助建站平台?
c++ stringstream用法详解_c++字符串与数字转换利器
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
如何做静态网页,sublimetext3.0制作静态网页?
香港服务器如何优化才能显著提升网站加载速度?
北京建设网站制作公司,北京古代建筑博物馆预约官网?
如何在阿里云虚拟服务器快速搭建网站?
建站VPS选购需注意哪些关键参数?
如何在阿里云域名上完成建站全流程?
广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?
如何登录建站主机?访问步骤全解析
如何在Golang中使用replace替换模块_指定本地或远程路径
如何制作算命网站,怎么注册算命网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。