iOS怎么通过取Session判断是否登陆?

[复制链接]
226 3
服务器后端用j2ee架构的,前端Web端已有相应的登陆页面,登陆成功后用户信息时保存在Session中。在浏览器(PC浏览器或者手机浏览器)没有问题,但在APP(iOS)做完登陆POST请求后(请求request1),再做其它请求(请求request2),Session中并找不到刚才登陆的用户信息,貌似服务器对request1和request2是区别对待的,不认为是同一个client,该怎么操作呢?

iOS APP代码:
(1)APP打开,先执行登陆的POST请求(这步是成功的,User信息保存在服务器端Session中)
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
let loginURL = "http://localhost:8080/m/login/loginCheck"
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.

userLogin()
}

//用户登陆
func userLogin() {
NetManager.POST(loginURL, parameters: ["userNo":"admin","pwd":"123"], success: { (responseObj) -> Void in
if let respDict = responseObj as? [String:NSObject] {
let ok = respDict["ok"] as! Bool
let errInfo = respDict["errInfo"] as! String
print("login: (ok), errInfo: (errInfo)")
}
}) { (error) in
print("login error: (error)")
}
}

(2)在另外一个ViewController进行WebSocket请求
class ChatRoomPanelVC: UIViewController, WebSocketDelegate, UITableViewDataSource, UITableViewDelegate {
var socketURL:String = "ws://localhost:8080/msgWebSocket"
var socket:WebSocket!

//MARK: - properties -
var roomId:String!

override func viewDidLoad() {
super.viewDidLoad()

socket = WebSocket(url: NSURL(string: socketURL)!)
socket.delegate = self
socket.connect()

changeChatRoom(roomId)
}

//进入聊天室
func changeChatRoom(roomId:String) {
let requestStr:String = "change_room_id:" + roomId
print("requestStr:(requestStr)")
socket.writeString(requestStr) // 这步请求发出后,第(3)步获取不到User信息
}

(3)服务器端
@Override
public void doFilter(ServletRequest req, ServletResponse rep,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) rep;

String uri = request.getRequestURI();
String fullUri = getFullUri(request);
if (StringUtilsEx.sameText(fullUri, request.getContextPath() + "/")
|| StringUtilsEx.sameText(fullUri, request.getContextPath())){
response.sendRedirect(request.getContextPath() + getUrlPermission().indexUrl(request, null));
return;
}
UserInfo loginUser = UserInfo.getLoginUser(request);


iOS端POST请求用的AFNetworking

举报 使用道具

回复

3 个评论

lilei-lil  注册会员  发表于 2019-1-15 01:07:59  | 显示全部楼层
服务器后端用j2ee架构的,前端Web端已有相应的登陆页面,登陆成功后用户信息时保存在Session中。在浏览器(PC浏览器或者手机浏览器)没有问题,但在APP(iOS)做完登陆POST请求后(请求request1),再做其它请求(请求request2),Session中并找不到刚才登陆的用户信息,貌似服务器对request1和request2是区别对待的,不认为是同一个client,该怎么操作呢?

iOS APP代码:
(1)APP打开,先执行登陆的POST请求(这步是成功的,User信息保存在服务器端Session中)
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
let loginURL = "http://localhost:8080/m/login/loginCheck"
override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        userLogin()
    }

    //用户登陆
    func userLogin() {
        NetManager.POST(loginURL, parameters: ["userNo":"admin","pwd":"123"], success: { (responseObj) -> Void in
            if let respDict = responseObj as? [String:NSObject] {
                let ok = respDict["ok"] as! Bool
                let errInfo = respDict["errInfo"] as! String
                print("login: (ok), errInfo: (errInfo)")
            }
            }) { (error) in
                print("login error: (error)")
        }
    }

(2)在另外一个ViewController进行WebSocket请求
class ChatRoomPanelVC: UIViewController, WebSocketDelegate, UITableViewDataSource, UITableViewDelegate {
    var socketURL:String = "ws://localhost:8080/msgWebSocket"
    var socket:WebSocket!
   
    //MARK: - properties -
    var roomId:String!
   
    override func viewDidLoad() {
        super.viewDidLoad()
        
        socket = WebSocket(url: NSURL(string: socketURL)!)
        socket.delegate = self
        socket.connect()
        
        changeChatRoom(roomId)
    }

    //进入聊天室
    func changeChatRoom(roomId:String) {
        let requestStr:String = "change_room_id:" + roomId
        print("requestStr:(requestStr)")
        socket.writeString(requestStr) // 这步请求发出后,第(3)步获取不到User信息
    }

(3)服务器端
    @Override
    public void doFilter(ServletRequest req, ServletResponse rep,
                         FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) rep;

        String uri = request.getRequestURI();
        String fullUri = getFullUri(request);
        if (StringUtilsEx.sameText(fullUri, request.getContextPath() + "/")
                || StringUtilsEx.sameText(fullUri, request.getContextPath())){
            response.sendRedirect(request.getContextPath() + getUrlPermission().indexUrl(request, null));
            return;
        }
        UserInfo loginUser = UserInfo.getLoginUser(request);


iOS端POST请求用的AFNetworking

举报 使用道具

回复
Olefgovvat  新手上路  发表于 2019-1-15 02:59:04  | 显示全部楼层
博主这个问题解决了嘛?

举报 使用道具

回复
米有爱  新手上路  发表于 2019-1-15 03:14:36  | 显示全部楼层
你用NetManager登录,然后又用WebSocket请求,用两种方式通讯当然会被认为是两个连接了。
估计你以前是在前端页面里面登录,然后还是在前端页面里面发WebSocket请求,所以这种情况是同一个连接,SESSION会保持。

建议你登录也用WebSocket实现,认证成功后建立连接,不成功关闭连接

举报 使用道具

回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

ios.irunthink.com
搜索
热搜: iOS swift 下拉刷新

图文热点

更多

开发教程

更多

客服中心

400-800 周一至周日 9:30-17:30 仅收市话费

关注我们

  • 微信扫描
  • 关注微信
关于我们
关于我们
友情链接
联系我们
帮助中心
精贴推荐
源码上传
注册登录
服务支持
资源下载
关注我们
官方微博
官方空间
快速回复 返回顶部 返回列表