2014年4月1日火曜日

VB.NET Spring Security ログイン


  • VB.NET でクッキーを保持
  • Spring ログインリクエストでJSONを返却
  • VB.NET 画面からログインPOST


SavedRequest が取得出来ない為、ログイン後リダイレクトが不可。
ログイン後レスポンスを変更する場合は SavedRequestAwareAuthenticationSuccessHandler で指定

Form1.vb
Public cookieData As CookieContainer = New CookieContainer
Private Sub search_proc(cd As String)
    Dim url As String = "http://localhost/sample/sampleList?cd=" & cd
    Dim req As HttpWebRequest = HttpWebRequest.Create(url)
    req.CookieContainer = cookieData
    Dim res As HttpWebResponse = req.GetResponse()
    Dim reader As StreamReader = New StreamReader(res.GetResponseStream())
    Dim jsonString As String = reader.ReadToEnd()
    Dim jsonList As List(Of JToken) = JArray.Parse(jsonString).Children.ToList
    If (jsonList.Count <> 0) Then
        Dim id As String = jsonList(0).Item("id")
        If (id = "-1") Then
            Form2.ShowDialog()
            Exit Sub
        End If
    End If
    For Each itemClass As JObject In jsonList
        itemClass.CreateReader()
        DataGridView1.Rows.Add(itemClass("id"), itemClass("code"), itemClass("name"))
    Next
    res.Close()
End Sub

Form2 に以下コントロールを配置
  • TextBox1 : ユーザ名
  • TextBox2 : パスワード
  • Button1 : ログインボタン

Form2.vb
Imports System.Net
Imports System.IO
Imports System.Text
Public Class Form2
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim ht As Hashtable = New Hashtable
        ht.Add("j_username", TextBox1.Text)
        ht.Add("j_password", TextBox2.Text)
        Dim param As String = ""
        For Each key As String In ht.Keys
            param = param & String.Format("&{0}={1}", key, ht(key))
        Next
        Dim paramBytes As Byte() = System.Text.Encoding.ASCII.GetBytes(param)
        Dim req As HttpWebRequest = HttpWebRequest.Create("http://localhost/sample/j_spring_security_check")
        Form1.cookieData = New CookieContainer
        req.CookieContainer = Form1.cookieData
        req.Method = "POST"
        req.ContentType = "application/x-www-form-urlencoded"
        req.ContentLength = paramBytes.Length
        Dim reqStream As Stream = req.GetRequestStream()
        reqStream.Write(paramBytes, 0, paramBytes.Length)
        reqStream.Close()
        Dim res As HttpWebResponse = req.GetResponse()
        For Each cookie In res.Cookies
            Console.WriteLine("cookie name = " & cookie.Name & ", value = " & cookie.Value)
            Form1.cookieData.Add(cookie)
        Next
        Dim resStream As Stream = res.GetResponseStream()
        Dim sr As New StreamReader(resStream, Encoding.UTF8)
        Console.WriteLine("test = " & sr.ReadToEnd())
        sr.Close()
        Me.Close()
    End Sub
End Class

jp/s6131/sample/controller/HomeController.java
@RequestMapping(value = "/login", method = RequestMethod.GET)
@ResponseBody
public List<Sample> login(HttpServletRequest req, Locale locale, Model model) {
    List<Sample> sampleList = new ArrayList<Sample>();
    Sample sample = new Sample();
    sample.setId(new Long(-1));
    sampleList.add(sample);
    return sampleList;
}


人気ブログランキングへ