Как обрабатывать сеанс Wicket для каждого клиента с помощью aop

Я использую Wicket 1.4.9 + Spring 3 + iBatis. Я хочу получить данные сеанса перед использованием транзакций, но у меня большая проблема, потому что эти данные помещаются в веб-сеанс Wicket (эти данные выбираются на странице входа).

Я использую spring aop для точечной резки, но я не могу указать сеанс резки для каждого клиента. Как решить эту проблему.

Объект класса пользователя

package com.app.entity;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable {

    private String name;
    private String lastname;
    private String username;
    private String password;
    private String crtUser;
    private Date crtDate;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    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;
    }

    public String getCrtUser() {
        return crtUser;
    }

    public void setCrtUser(String crtUser) {
        this.crtUser = crtUser;
    }

    public Date getCrtDate() {
        return crtDate;
    }

    public void setCrtDate(Date crtDate) {
        this.crtDate = crtDate;
    }

}

Класс веб-приложения

package com.app.conf;

import org.apache.wicket.Page;
import org.apache.wicket.Request;
import org.apache.wicket.Response;
import org.apache.wicket.Session;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.spring.injection.annot.SpringComponentInjector;

import com.app.page.UserLoginPage;

public class WebApp extends WebApplication {

    @Override
    protected void init() {
        addComponentInstantiationListener(new SpringComponentInjector(this));
    }

    @Override
    public Class<? extends Page> getHomePage() {
        return UserLoginPage.class;
    }

    @Override
    public Session newSession(Request request, Response response) {
        return new CustomSession(request);
    }

}

Пользовательский класс сеанса

package com.app.conf;

import org.apache.wicket.Request;
import org.apache.wicket.protocol.http.WebSession;

import com.app.entity.User;

public class CustomSession extends WebSession {

    private User user;

    public CustomSession(Request request) {
        super(request);
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

}

Страница входа пользователя: сохранить сеанс при входе в систему

package com.app.page;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.PasswordTextField;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.PropertyModel;

import com.app.conf.CustomSession;
import com.app.entity.User;

public class UserLoginPage extends WebPage {

    private LoginForm form;

    public UserLoginPage() {
        form = new LoginForm("form");
        add(form);
    }

    private class LoginForm extends Form{

        private User user;

        private TextField<String> username;
        private PasswordTextField password;
        private AjaxButton submitButton;

        public LoginForm(String id) {
            super(id);

            user = new User();

            username = new TextField<String>("username",
                    new PropertyModel<String>(this, "user.username"));
            add(username);

            password = new PasswordTextField("password" , 
                    new PropertyModel<String>(this, "user.password"));
            add(password);

            submitButton = new AjaxButton("submitButton", this) {

                @Override
                protected void onSubmit(AjaxRequestTarget arg0, Form<?> arg1) {
                    getCustomSession().setUser(user);
                    setResponsePage(new UserAddPage());
                }
            };
            add(submitButton);
        }
    }

    public CustomSession getCustomSession(){
        return (CustomSession)getSession();
    }

}

Страница добавления пользователя: я хочу вставить точку в метод класса обслуживания и получить сеанс для добавления. Создать пользователя и создать дату в классе объектов пользователя.

package com.app.page;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.PasswordTextField;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.spring.injection.annot.SpringBean;

import com.app.entity.User;
import com.app.service.IUserService;

public class UserAddPage extends WebPage {

    @SpringBean private IUserService userService;

    private UserAddForm form;

    public UserAddPage() {
        form = new UserAddForm("form");
        add(form);
    }

    private class UserAddForm extends Form {

        private User user;

        private TextField<String> name;
        private TextField<String> lastname;
        private TextField<String> username;
        private PasswordTextField password;
        private AjaxButton submitButton;

        public UserAddForm(String id) {
            super(id);
            user = new User();

            name = new TextField<String>("name",
                    new PropertyModel<String>(this, "user.name"));
            add(name);

            lastname = new TextField<String>("lastname" , 
                    new PropertyModel<String>(this, "user.lastname"));
            add(lastname);

            username = new TextField<String>("username",
                    new PropertyModel<String>(this, "user.username"));
            add(username);

            password = new PasswordTextField("password" , 
                    new PropertyModel<String>(this, "user.password"));
            add(password);

            submitButton = new AjaxButton("submitButton", this) {

                @Override
                protected void onSubmit(AjaxRequestTarget arg0, Form<?> arg1) {
                    /*
                     * HOW TO POINT CUT THIS METHOD AND GET SESSION BEFORE INSERT
                     */
                    userService.insert(user);
                }
            };
            add(submitButton);
        }

    }

}

Пользовательский аспект

package com.app.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

import com.app.entity.User;

@Aspect
public class UserAspect {

    @Pointcut("execution(* com.app.service..*.insert*(..))&&" + "args(user)")
    public void userPointcut(User user){}

    @Around("userPointcut(user)")
    public Object aroundUser(ProceedingJoinPoint pj, User user) throws Throwable{
        /*
         * How to get Create User from Session
         */
        return pj.proceed();
    }

}

person suchai    schedule 19.07.2010    source источник
comment
Это интересно, и я буду рад попробовать, если вы предоставите дополнительную информацию. Что за данные, когда они создаются, когда создается сессия, для чего они нужны. Почему бы вам не показать пример кода того, что вы уже пробовали?   -  person Sean Patrick Floyd    schedule 21.07.2010
comment
Помоги мне ! для решения этой проблемы   -  person suchai    schedule 28.07.2010


Ответы (1)


WebApp.getSession().getUser() ?

Я предполагаю, что вы хотите зарегистрировать bean-компонент в контексте spring, который может предоставить авторизованному пользователю. Это может получить пользователя из вашего сеанса WebApp (экземпляр WebApp также будет зарегистрированным bean-компонентом, но я предполагаю, что он уже есть). В весенних документах/сообществе должно быть много информации об этом варианте использования.

Для получения более подробных ответов вам следует уточнить свой вопрос (использование блоков кода) и указать вариант использования.

person ireddick    schedule 28.07.2010