游戏登录时用户有所在查看服务器登录用户的角色才让登录,用javaweb怎么写判断

到服务器验证用户名和密码
本文所属图书&>&
本书基于建构主义教育思想,通过大量循序渐进的案例,让学生在体验中掌握Java语句,同时获得编程能力、排错能力和学习能力。本书多次使用陷阱式教学法,帮助学生深刻理解所学知识,理解面向对象编程思想。本书详...&&
我们的聊天工具项目在前面已经实现了界面和聊天记录的处理,其中从登录界面到主界面是在&登录&按钮的事件中得到用户名和密码的,经过验证后显示主界面。这么做并不合理,用户名和密码的验证应该在服务器完成,这样我们要完成以下几步工作。
(1)将用户名和密码发送到服务器。
(2)服务器进行验证。
(3)将验证结果返回客户端。
(4)客户端根据返回结果决定显示主界面。
下面我们先来实现第一步。首先建立服务器QQServer,然后在QQLogin中将用户名和密码发送到服务器。这里需要讨论的一个问题是,用户名和密码是一次发送到服务器,还是分两次发送?要知道相对于运行在内存里的程序,网络操作是个非常慢并且消耗资源的操作,所以我们尽可能地减少网络操作次数,最好能够一次将用户名和密码同时发送到服务器。这样又出现了问题,如果用户名是aaa,密码是111,服务器接收了有可能会认为用户名是aa,密码是a111。为了不出现这样的问题,我们需要在用户名和密码之间加入分隔符。进一步的问题是,如果分隔符是%,那么刚才的用户名和密码就组合成为aaa%111,可是如果用户起的用户名里有%怎么办,所以往往分隔符不是常见的ASCII码字符,而是比较复杂的,从教学的角度考虑,我们在这本书中使用%作为分隔符,虽然有瑕疵,但是避免了我们将注意力集中在此细节中。
先不要看我提供的代码,努力争取自己来实现,然后再比照我的代码。下面提供的是服务器和QQLogin中&登录&按钮事件的代码。考虑到之后的代码在逻辑上会很复杂,我重新启用程序编写顺序的编号,这些编号不管界面代码。学到现在,我们知道有些顺序并不那么严格,而且每个人都会有自己的编码习惯,为了忽略这些因素,我尽可能地遵循程序运行的顺序来编号。
6 import java.net.*;
7 import java.io.*;
1 public class QQServer {
3&&&& public static void main(String[] args) {
4&&&&&&&& try{
8&&&&&&&&&&&& //服务器在8000端口监听
9&&&&&&&&&&&& ServerSocket ss = new ServerSocket(8000) ;
&&&&&&&&&&&&&&&
10&&&&&&&&&&&& System.out.println(&服务器正在8000端口监听......&) ;
11&&&&&&&&&&&& Socket s = ss.accept() ;
&&&&&&&&&&&&&&&
18&&&&&&&&&&&& //接收用户名和密码
19&&&&&&&&&&&& InputStream is = s.getInputStream() ;
20&&&&&&&&&&&& InputStreamReader isr = new InputStreamReader(is) ;
21&&&&&&&&&&&& BufferedReader br = new BufferedReader(isr) ;
&&&&&&&&&&&&&&&
22&&&&&&&&&&&& String uandp = br.readLine() ;
&&&&&&&&&&&&&&&
27&&&&&&&&&&&& //检验点
28&&&&&&&&&&&& System.out.println(uandp) ;
5&&&&&&&& }catch(Exception e){}
你发现我所提供的顺序编号不是连续的,当服务器程序停在accept等待时,客户端开始运行,所以有些编号在客户端,请按照编号顺序来写程序,这样可能需要在两个程序之间切换。下面是QQLogin中的&登录&按钮事件代码,你需要自行在程序的最上面添加导入java.net.*和java.io.*的语句。
&&&&&&& if (arg0.getActionCommand().equals(&登录&)) {
12&&&&&&&& try {
14&&&&&&&&&&&& //发送用户名和密码到服务器端
15&&&&&&&&&&&& String user = txtUser.getText();
16&&&&&&&&&&&& String pass = txtPass.getText();
17&&&&&&&&&&&& Socket s = new Socket(&127.0.0.1& , 8000) ;
&&&&&&&&&&&&&&&&&&&&&&
23&&&&&&&&&&&& OutputStream os = s.getOutputStream() ;
24&&&&&&&&&&&& OutputStreamWriter osw=new OutputStreamWriter(os);
25&&&&&&&&&&&& PrintWriter pw = new PrintWriter(osw , true) ;
&&&&&&&&&&&&&&&&&&&&&&
26&&&&&&&&&&&& pw.println(user+&%&+pass) ;
&&&&&&&&&&&&&&&&&&&&&&
13&&&&&&&& } catch (Exception e) {}
服务器会在两个地方停下来,其中一个是端口监听,程序停在11行;另一个是readLine,接受输入,停在22行。我提供了第一个检验点,用来证明这之上的代码是有效的,在客户端输出时别忘了25行加上true,使用自动刷新模式。
我们继续,下一步是服务器端的验证。按理说应到中验证,但是我们并没有学习如何使用,所以这步暂时跳过去,使用简单的if来判断,等下一个部分学习了数据库的知识后我们再补上。
在判断之前,有一个问题,现在用户名和密码是用%分隔的,所以需要将用户名和密码拆分出来,这得怎么做?在面向对象的世界里,要完成什么操作,我们通常会想到对象的方法,用户名和密码被放在uandp中,那么我们先看uandp有没有能力做这样的拆分。我带你去尝试,uandp有没有这样的能力,就是看有没有相应的方法,假设你的英文不是很好,那么怎么知道什么方法是可以尝试的,你想uandp是什么,是一个字符串吧,好,我们现在要拆分这个字符串,这样就会得到至少两个字符串,作为方法的返回值,只能是一个值,那么什么值能够装两个以上的字符串?你先想想,然后试试。
没错,只有字符串数组能够用一个名字提供两个字符串,那你找找哪个方法能够提供字符串数组,这个相当容易找到,是split,split方法需要一个字符串参数,我想能够猜出来,参数就是告诉split方法,我们将用什么字符串作为分隔符来拆分。我想你能够将程序向前推进吧。
29&&&& //拆分用户名和密码
30&&&& String u = uandp.split(&%&)[0] ;
31&&&& String p = uandp.split(&%&)[1] ;
32&&&& if(u.equals(&aaa&)&&p.equals(&111&)){
35&&&&&&&& //发送正确信息到客户端
33&&&& }else {
36&&&&&&&& //发送错误信息到客户端
请你自行加入检验点来验证拆分是正确的。下一步是发送确认信息到客户端,这样客户端就能够根据发送回来的信息决定是否显示主窗体了。我们需要先写客户端代码,因为接收总是要先准备好,下面的代码追加在刚才显示的那些客户端代码后面。
37&&&& //接受服务器发送回来的确认信息
38&&&& InputStream is = s.getInputStream() ;
39&&&& InputStreamReader isr = new InputStreamReader(is) ;
40&&&& BufferedReader br = new BufferedReader(isr) ;
&&&&&&&&&&&&&&&
41&&&& String yorn = br.readLine() ;
47&&&& //显示主窗体
48&&&& if (yorn.equals(&ok&)) {
51&&&&&&&& QQMain w = new QQMain();
52&&&&&&&& w.setVisible(true);
53&&&&&&&& this.setVisible(false);
50&&&& }else {
54&&&&&&&& JOptionPane.showMessageDialog(this, &对不起,用户名或密码错误&) ;
服务器端发送信息的代码如下:
42&&&& OutputStream os = s.getOutputStream() ;
43&&&& OutputStreamWriter osw = new OutputStreamWriter(os) ;
44&&&& PrintWriter pw = new PrintWriter(osw , true) ;
32&&&& if(u.equals(&aaa&)&&p.equals(&111&)){
35&&&&&&&& //发送正确信息到客户端
45&&&&&&&& pw.println(&ok&) ;
33&&&& }else {
36&&&&&&&& //发送错误信息到客户端
46&&&&&&&& pw.println(&err&) ;
似乎一切顺利,运行服务器端代码,然后运行客户端代码,如果输入的用户名是aaa,密码是111,那么我们将看到主界面被显示出来;如果输入不正确,则会有一个消息框弹出来。我们遇到了一个问题,再运行一遍这段代码,在用户名处输入aaa,而在密码处什么都不输入,然后单击&登录&按钮,你会发现不但主界面没有显示,连消息框都没有出现,程序在这一步完全没有反应。没有反应意味着什么?没有反应意味着程序落入了异常,打印异常看看。
在实验的时候要注意,我们的代码还不能支持多次登录,每登录一次,就要将服务器端代码再运行一次。
原因是在服务器端拆分的时候,由于没有密码,所以拆分出来的数值是只有下标为0的内容,没有下标为1的内容。如何解决这个问题?一个方案是在客户端判断,要求用户必须输入用户名和密码;另一个方案是在拆分的时候判断数组中有几个项目,具体的操作我就不用代码演示了。你自己试着去做,你觉得哪个方案更好呢?答案是两个方案都要采用,在真正的项目中,有可能客户端代码和服务器端代码是由不同的两个人完成的,当出现这个问题时,服务器端的程序员说:&我以为客户端程序员已经进行了验证,会提交正确信息给我。&而客户端的程序员也会说:&我觉得这个验证的工作就应该由服务器端完成。&这样一个多人合作的项目就会遇到协调不一致的问题,一个好的程序员要提交让人放心的代码,就是考虑周全的代码,客户端和服务器端都考虑并拦截了这个错误,整个程序才可能是健壮的。
我不管客户端判断,刚才提到服务器端处理这个问题的方案是判断拆分出来的数量,其实有更好的办法解决这个问题。
//拆分用户名和密码
String u = && ;
String p = && ;
&&& u = uandp.split(&%&)[0] ;
&&& p = uandp.split(&%&)[1] ;
}catch(Exception ee){}
来看这段代码的写法,我们先定义了u和p,并且让它们的初值都是空字符串。下面在一个try catch语句中拆分赋值,你发现一旦发生了问题,代码会落到catch中,而catch语句什么都没做,这样p的初值还是空字符串,而这个结果正是我想要的。我巧妙地运用了try catch语句,这时try catch语句起到了if的作用,所以try catch语句并不是完全为了满足无聊的语法而设置的,在很多地方它会起到意想不到的作用。比如,我们要验证一个字符串的内容是不是纯数字,巧妙的办法是将这个字符串转换成数字,然后再将数字转换成字符串,这样什么都没有改变,如果这个操作被放在try catch中,转换失败就会出现异常,程序就会落到catch语句中,这样也就说明这个字符串不是纯数字了。
为了使后面的代码尽可能的简洁,我依然使用没有进行验证的代码。
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。
文章下载读书博客分类:
14年的这个时候我才刚刚开始接触Java web,在这一年中也用这个技术做了不少大大小小的项目,中间也学了几个月的云计算,自己的技术水平提升多少我想这个可以从写博客的水平反映出一个人技术水平的好坏,当然我也很感激我自己可以慢慢的养写博客的习惯,记录自己轨迹。
这几天的面试使我觉得基础知识真的很重要,我几乎一口气看完了《疯狂java突破程序员基本功的16课》、《深入理解java虚拟机》确实收益颇丰。
所谓合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下所以在以后的学习中要深挖技术点举一反三。
Java web中有两个非常重要的机制就是cookie机制和session机制,虽然很基础但是很有必要深入了解一下。
1、session和cookie的区别:
Cookies是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的硬盘读取数据的一种技术。Cookies是当你浏览某网站时,由Web服务器置于你硬盘上的一个非常小的文本文件,它可以记录你的用户ID、密码、浏览过的网页、停留的时间等信息。
session: 当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。
以上使我搜集出来对它们的不错的解释。
2、cookie机制:采用的是在客户端保持状态的方案,而session机制采用的是在服务端保持状态的方案。同时我们看到由于服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助cookie机制来达到保存标识的目的。
cookie的内容主要包括:名字、值、过期时间、路径和域。路径和域一起构成cookie的作用范围。所不设置cookie的过期时间那么就称这个cookie是会话级别的cookie,关闭浏览器cookie就消失。会话级别的cookie一般不存储在硬盘上而存储在内存里面。若设置了过期时间浏览器就会把cookie存储到硬盘上,关闭浏览器再打开,cookie会一直存在知道超过过期时间。存储在硬盘上的cookie可以被不同的浏览器所共享.
3、 session机制:session机制是一种服务端的机制,服务器使用一种一种类似散列表的结构(应该就是map结构了吧)
服务器首先检查这个客户端的请求里是否已经包含了一个session标识(session id)如果含有sessionid则说明以前为此客户端创建过session服务器就会把这个按照session Id把session给检索出来(如果检索不到就会重新建立一个session),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此对应的session id,session id是一个不会重复的字符串,该id会在本次响应客户端的时候传送给客户端。
4、保存这个session id的方式:
a、可以采用cookie,这样就可以在交互的过程中自动的按照规则把这个表示发送给服务器。一般这个cookie的名字类似于SEEESIONID的,但是cookie可以被人为禁止。
b、所以也经常使用一种使用一种叫做URL重写的技术,就是把sessionid直接附加在URL路径的后面。
c、还有一种技术叫做表单隐藏字段。就是服务器会自动修改表单添加一个隐藏的字段,在表单提交的时候就会把这个session id传递会服务器。
5、session和cookie的区别:
cookie数据放在客户端,session数据放在服务器端。
cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗考虑安全性的话应该使用session。
session因为在服务器上保存了很多信息,当在访问量比较大的时候会增加服务器的负担,从这方面考虑应该使用cookie
单个cookie的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie
有人建议将登录信息等重要信息放在session中,非重要的信息可以放在cookie中。
二、不过cookie都可以用在那些地方呢?
1、可以实现自动登录的功能:
当用户注册网站的时候我们可以把用来唯一标识用户id的cookie保存到客户端,当用户再次打开我那个站的时候会把这个id发送到服务器,检查用户是否选择自动登录,然后既可以为用户自动执行登陆操作。
2、cookie的使用方法 :我们需要使用HttpServletResponse的addCookie方法把cookie插入到HTTP请求报头。我们需要使用HttpServletRequest的getCookie方法获得cookie对象的数组。
3、session的创建:是在用户访问到某个程序致使它执行HttpServletSession.getSession(true)这样的语句的时候才会被创建
4、session的销毁:
a、程序调用HttpSession.invalidate()
b、客户再一次放松sessionId的时间间隔超过了session的最大有效时间
c、服务器进程被停止
再次注意关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效。大部分的Session机制都使用进程中Cookie来保存Session id的,关闭浏览器后这个进程也就自动消失了,进程中的Cookie自然就消失了,那么Session id也跟着消失了,再次连接到服务器时也就无法找到原来的Session了。
因为服务器是不会知道浏览器关闭了没有(当然,你可以在关闭的时候去通知服务器,但一般都不会这样做),所以关闭浏览器时服务器是不会删除Session的,也正是这个原因服务器才会设置一个Session失效时间的,不然服务器早晚会被撑爆的。等距离上一次使用该Session的时间达到设置的失效时间时,服务器就会认为客户端已停止活动,便会将相应的Session删除。
5、getSession()/getSession(true)、getSession(false)的区别  getSession()/getSession(true):当session存在时返回该session,否则新
建一个session并返回该对象  getSession(false):当session存在时返回该session,否则不会新建
session,返回null
6、将用户从系统中注销并删除所有属于他(或她)的会话  调用logOut,将客户从Web服务器中注销,同时废弃所有与该用户相关联的会话(每个Web应用至多一个)。这个操作有可能影响到服务器上多个不同的Web应用
come_for_dream
浏览: 64560 次
来自: 长沙
残云cruel 写道师傅,你的新网站有bug,没地方评论。 心 ...
师傅,你的新网站有bug,没地方评论。 心塞啊!
呀,界面挺好看的啊,嗯呢 不错不错。年轻人 有前途,值得栽培
yzsunlight 写道代码可否共享https://gith ...
代码可否共享
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'游戏服务器与普通服务器有什么区别? - 知乎<strong class="NumberBoard-itemValue" title="被浏览<strong class="NumberBoard-itemValue" title="6,856分享邀请回答26723 条评论分享收藏感谢收起1208 条评论分享收藏感谢收起android获取web服务器端session并验证登陆 | YoYong}

我要回帖

更多关于 服务器多用户登录 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信